簡體   English   中英

驗證字段時如何避免重復檢查空值?

[英]How to avoid repetitive check of null value when validating fields?

我想使用java驗證器驗證簡單的帳戶數據。 任何帳戶數據字段都不能為空,因此所有帳戶數據字段都注釋為@NotNull。 但我還是要檢查提供的密碼是否相同,重復是否相等。 這迫使我通過檢查空相等來避免NullPointerException。 請參閱代碼(我為了簡潔而省略了Maven依賴,因為依賴關系和正確的庫不會導致問題):

AccountData類:

@ValidPassword
class AccountData {

@NotNull
public String login;

@NotNull
public String password;

@NotNull
public String repeatedPassword;

@NotNull
public String emailAddress;

@NotNull
public String countryName;  
}

ValidCountry接口:

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CountryValidatorImplementation.class)
@Documented
@interface ValidPassword {
   String message() default "Passwords don't match";
   Class<?>[] groups() default {}; 
   Class<? extends Payload>[] payload() default {};
}

PasswordValidatorImplementation(在單獨的.java文件中):

public class CountryValidatorImplementation implements 
PasswordValidator<ValidPassword, Object> {

public PasswordValidatorImplementation() {

}

public boolean isValid(Object value, ConstraintValidatorContext context) {

    AccountData accountData = (AccountData) value;

    if(!accountData.password.equals(accountData.password)) {
      return false;  
    }
    //Not checking if account with login already exists in a DB for 
    //brevity
    return true;

}
}

用法主要方法:

  • 因為我首先以編程方式設置密碼和repeatedPassword,所以不會導致NullPointerException:

     ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); AccountData accountData = new AccountData(); accountData.password = "1234"; accountData.repeatedPassword = "5678"; Set<ConstraintViolation<AccountData>> constraintViolationSet = validator.validate(accountData); 
  • 導致NullPointerException,因為執行驗證的密碼為null:

     ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); AccountData accountData = new AccountData(); Set<ConstraintViolation<AccountData>> constraintViolationSet = validator.validate(accountData); 

是否有可能在字段上執行@NotNull指示驗證並為isValid返回false(或者甚至更早地拋出異常),這要歸功於這些注釋,以便檢查是否不再需要任何AccountData字段? *歡迎彈簧相關解決方案!

不,你不能提前停止驗證。 將處理每個注釋,因此可以一起報告所有問題。 這比強制反復試錯要好得多,因為用戶依次修復每個問題。

實際上,您應該編寫幾乎所有自定義驗證器,以將null視為有效。 然后它們更有用,可以根據需要與@NotNull結合使用。

public boolean isValid(Object value, ConstraintValidatorContext context) {
    if (value == null) {
        return true;
    }
    // ...

由於您的驗證器處理的字段值也可能為null,您可能需要這樣的東西。

public class PasswordValidatorImpl implements PasswordValidator<ValidPassword, AccountData> {
    public boolean isValid(AccountData value, ConstraintValidatorContext context) {
        return value == null || Objects.equals(value.password, value.repeatedPassword);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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