У меня есть простой класс, который проверяется с использованием метода boolean isValid()
, который работает, и, конечно же, сообщение об ошибке находится на уровне класса/типа.
Вот мой простой класс:
public class NewPasswordDTO {
@NotNull
public String password;
@NotNull
public String confirmation;
@AssertTrue(message="Passwords must match.")
protected boolean isValid() {
return password.equals(confirmation);
}
}
Но то, что я действительно хочу, это что-то вроде этого:
public class NewPasswordDTO {
@NotNull
@Equals("confirmation", message="...")
public String password;
@NotNull
public String confirmation;
}
Таким образом, сообщение об ошибке будет установлено на уровне поля, а не на уровне класса/типа.
Это возможно как-то? Может быть, использовать собственный валидатор для этого класса?
Заранее спасибо!
РЕШЕНИЕ:
Спасибо Гуннару! Я только что придумал отличное универсальное решение :-)
. Я просто использовал (имеется в виду копирование и вставка) код из Hibernates @ScriptAssert
и ScriptAssertValidator
и немного изменил его:
@ScriptAssert
:
- Добавьте новый
String field()
. (здесь добавляется сообщение об ошибке)
ScriptAssertValidator
:
Внутри метода
initialize
не забудьте также сохранить свойстваfieldName
иmessage
, потому что нам нужно получить к ним доступ на следующем шаге.Добавьте этот фрагмент внизу метода
isValid
:context.buildConstraintViolationWithTemplate(errorMessage) .addPropertyNode(fieldName).addConstraintViolation();
Также добавьте
context.disableDefaultConstraintViolation();
где-нибудь внутри методаisValid
, чтобы не генерировать сообщение об ошибке по умолчанию, которое в противном случае было бы добавлено на уровне класса.
И это все. Теперь я могу использовать его так:
@FieldScriptAssert(lang="javascript", script="_this.password.equals(_this.confirmation)", field="password", message="...")
public class NewPasswordDTO { ... }