DropWizard @ValidationMethod Изменить имя свойства

У меня есть представление в Dropwizard, в котором есть методы с аннотацией @ValidationMethod.

Пример дропвизарда:

@ValidationMethod(message="may not be Coda")
public boolean isNotCoda() {
return !("Coda".equals(name));
}

Обратите внимание, что метод должен начинаться с is. Это ограничение Hibernate Validator.

Мой пример:

@NotBlank(message = REQUIRED)
private String password;


@JsonIgnore
@ValidationMethod(message = "the password fields must match")
public boolean isPasswordEqualRepeatedPassword() {
    
}

@JsonIgnore
@ValidationMethod(message = "the password must not contain or be equal to the username")
public boolean isNotEqualOrContainUsername(){

}

Текущий ответ:

field : PasswordEqualRepeatedPassword, message = поля пароля должны совпадать

field : NotEqualOrContainUsername, message = пароль не должен содержать или совпадать с именем пользователя

Я хочу, чтобы поле было равно паролю, как атрибут класса. Проблема в том, что я не могу назвать методы isPassword(), чтобы получить следующий ответ:

поле : пароль, сообщение = поля пароля должны совпадать

поле : пароль, сообщение = пароль не должен содержать или совпадать с именем пользователя

Есть ли способ сделать это?


person user3722804    schedule 17.06.2015    source источник


Ответы (1)


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

Для этой конкретной проблемы мы нашли обходной путь, добавив пользовательский формат строки в сообщения проверки.

  @ValidationMethod(message = "[password]the password fields must match")

И затем, когда мы анализируем сообщение, мы получаем поле пароля.

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

public class UnprocessableEntityExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

  @Override
  public Response toResponse(ConstraintViolationException exception) {
    return Response
        .status(422)
        .entity(doMagic(exception))
        .type(MediaType.APPLICATION_JSON_TYPE)
        .build();
  }
}

doMagic - это потенциальная кроличья нора, но я рекомендую попробовать и отладить там, а затем вернуть объект, который будет представлять вашу ошибку в JSON. Соответствующие биты:

  • exception.getConstraintViolations() вернет список нарушений для работы.
  • constraintViolation.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod — это то, как вы узнаете, что это ValidationMethod dropwizard.
  • constraintViolation.getMessage() вернет "[password]the password fields must match" в этом примере.
person Natan    schedule 26.01.2021