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