Я хочу проверить простые данные аккаунта, используя валидатор 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;
}
}
Использование в основном методе:
Не вызывает исключение 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, поскольку пароль I, для которого выполняется проверка, является нулевым:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
AccountData accountData = new AccountData();
Set<ConstraintViolation<AccountData>> constraintViolationSet =
validator.validate(accountData);
Есть ли какая-либо возможность выполнить указанную @NotNull проверку для полей и вернуть false для isValid (или даже ранее, создавшего исключение) благодаря этим аннотациям, чтобы проверить, больше не понадобится ли какое-либо из полей AccountData? * Весенние решения также приветствуются!