Как избежать повторной проверки нулевого значения при проверке полей? - PullRequest
0 голосов
/ 09 июня 2019

Я хочу проверить простые данные аккаунта, используя валидатор 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? * Весенние решения также приветствуются!

1 Ответ

0 голосов
/ 09 июня 2019

Нет, вы не можете остановить проверку рано. Каждая аннотация будет обработана, поэтому о всех проблемах можно сообщать вместе. Это гораздо лучше, чем принудительное повторение проб и ошибок, поскольку пользователь по очереди решает каждую проблему.

На самом деле, вы должны написать почти все ваши собственные валидаторы, чтобы считать null действительным. Тогда они гораздо полезнее и могут быть объединены с @NotNull или не так, как нужно.

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

Поскольку ваш валидатор имеет дело со значениями полей, которые также могут быть нулевыми, вы, вероятно, захотите что-то подобное.

public class PasswordValidatorImpl implements PasswordValidator<ValidPassword, AccountData> {
    public boolean isValid(AccountData value, ConstraintValidatorContext context) {
        return value == null || Objects.equals(value.password, value.repeatedPassword);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...