簡體   English   中英

Java Spring Boot 驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM