Вы не можете сделать это нормально.
Вот что я сделал, чтобы получить больше динамических проверок, работающих через Hibernate Validator.
- Расширить класс
ClassValidator
.
- Переопределить метод
getInvalidVaues(Object myObj)
. Сначала позвоните по номеру super.getInvalidValues(myObj)
, а затем добавьте хук к вашей индивидуальной проверке.
- Создайте свой пользовательский валидатор и позвоните
getInvalidValues
для подтверждения. На этом этапе начинаются любые аннотированные проверки в спящем режиме, и ваши пользовательские динамические проверки (все, что не поддерживается аннотациями) также запускаются.
Пример:
public class MyObjectValidator extends ClassValidator<MyObject>
{
public MyObjectValidator()
{
super(MyObject.class);
}
public InvalidValue[] getInvalidValues(MyObject myObj)
{
List<InvalidValue> invalids = new ArrayList<InvalidValue>();
invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));
// add custom validations here
invalids.addAll(validateDynamicStuff(myObj));
InvalidValue[] results = new InvalidValue[invalids.size()];
return invalids.toArray(results);
}
private List<InvalidValue> validateDynamicStuff(MyObject myObj)
{
// ... whatever validations you want ...
}
}
Таким образом, ваш пользовательский код проверки может содержать логику типа «Выполните эту проверку, если пользователь ее настроил, в противном случае сделайте это» и т. Д. Вы можете или не сможете использовать тот же код, который поддерживает проверки гибернации, но в любом случае то, что вы делаете, является более сложным, чем «нормальный» вариант использования для средства проверки гибернации.