[英]Java Spring Boot Validation
我有一個問題是我們必須在 Spring Boot 中使用 javax 驗證作為我們的驗證器嗎? 因為我覺得如果業務邏輯變得越來越復雜是比較麻煩的。 而且,驗證沒有順序,這讓我必須為每個輸入創建組序列,我們需要創建一個自定義注釋來驗證是否需要比較輸入(如密碼)和確認密碼。
實際上,我想知道我是否以錯誤的方式進行了 javax 驗證。 如果你們發現問題,請糾正我。
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfirmPassword(groups = ConfirmPasswordGroup.ConfirmPasswordSecond.class)
public class UsersEntityDTO {
public int id;
@NotBlank(message ="Username is required", groups = UsernameGroup.UsernameFirst.class)
@Size(min = 6, max = 15, message = "Username must be more than 5 characters and less than 16", groups = UsernameGroup.UsernameSecond.class)
@Pattern.List({
@Pattern(regexp = "^\\S*$", message = "Username cannot contain any whitespaces and special characters", groups = UsernameGroup.UsernameThird.class),
@Pattern(regexp = "^[A-Za-z0-9 ]+$", message = "Username cannot contain any whitespaces and special characters", groups = UsernameGroup.UsernameFourth.class)
})
@UniqueUsername(groups = UsernameGroup.UsernameFifth.class)
public String username;
@NotBlank(message ="FullName is required", groups = FullnameGroup.FullnameFirst.class)
@Size(min = 6, max = 70, message = "FullName must be more than 5 characters and less than 71", groups = FullnameGroup.FullnameSecond.class)
@Pattern(regexp = "^[a-zA-Z ]*$", message = "FullName cannot contain any special characters and digits", groups = FullnameGroup.FullnameThird.class)
public String fullname;
@NotBlank(message ="Phone is required", groups = PhoneGroup.PhoneFirst.class)
@Size(min = 10, max = 11, message = "Please enter a correct phone number", groups = PhoneGroup.PhoneSecond.class)
@Pattern(regexp = "^[0-9]*$", message = "Phone number must only be digits", groups = PhoneGroup.PhoneThird.class)
public String phone;
@NotBlank(message ="Email is required", groups = EmailGroup.EmailFirst.class)
@Email(message = "Please enter a correct email", groups = EmailGroup.EmailSecond.class)
@UniqueEmail(groups = EmailGroup.EmailThird.class)
public String email;
@NotBlank(message ="Address is required", groups = AddressGroup.AddressFirst.class)
@Size(min = 20, max = 250, message = "Address must be more than 20 characters and less than 250", groups = AddressGroup.AddressSecond.class)
public String address;
@NotBlank(message ="Password is required", groups = PasswordGroup.PasswordFirst.class)
@Size(min = 6, message = "Password must be more than 5 characters", groups = PasswordGroup.PasswordSecond.class)
public String password;
@NotBlank(message ="Confirm Password is required", groups = ConfirmPasswordGroup.ConfirmPasswordFirst.class)
public String confirmPassword;
public String token;
@NotBlank(message ="Status is required", groups = ConfirmPasswordGroup.ConfirmPasswordFirst.class)
@StatusName(groups = ConfirmPasswordGroup.ConfirmPasswordSecond.class)
public String status;
public Date registration_date;
}
最后一件事是我可以在控制器下創建 if else 語句作為我們的驗證器嗎? 我認為這更靈活,更容易。
對於更復雜的邏輯,您可以實現自己的驗證器,例如
import org.springframework.validation.Validator;
public class PasswordValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return UsersEntityDTO.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
UsersEntityDTO user = (UsersEntityDTO) target;
if(user.getPassword()==null || user.getPassword().trim().equals("")) {
errors.rejectValue("password", "user.password.empty");
}
//other complex scenarios like whether password matches existing password etc.
}
然后在控制器中,無論您喜歡哪種方式,調用驗證器
passwordValidator.validate(user, bindingResult);
if(bindingResult.hasErrors()) {
//error
}
這樣,您的驗證邏輯將與 Controller 分離(單一職責)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.