Как я могу изменить правила проверки аннотаций/Hibernate во время выполнения?
-
09-09-2019 - |
Вопрос
Если у вас есть класс Java с некоторыми полями, я хочу проверить их с помощью Hibernate Validator.Теперь я хочу, чтобы мои пользователи могли настраивать во время выполнения, какие проверки будут выполняться.
Например:
public class MyPojo {
...
@NotEmpty
String void getMyField() {
...
}
...
}
Допустим, я хочу удалить NotEmpty
проверьте или замените его на Email
или CreditCardNumber
, как мне это сделать?Возможно ли это вообще?Я думаю, это сводится к изменению аннотаций во время выполнения...
Решение
Вы не можете сделать это нормально.
Вот что я сделал, чтобы обеспечить более динамичную проверку через 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 ...
}
}
Таким образом, ваш собственный код проверки может содержать логику типа «Выполните эту проверку, если ее настроил пользователь, в противном случае выполните ту» и т. д.Вы можете использовать или не использовать тот же код, который обеспечивает проверку спящего режима, но в любом случае то, что вы делаете, более сложно, чем «обычный» вариант использования валидатора спящего режима.
Другие советы
На самом деле это возможно в валидаторе hibernate 4.1.Просто прочитайте документацию о программное создание ограничений.
Я не думаю, что вы сможете удалить или изменить аннотацию, это часть определения класса.Вы можете создать новый класс, что возможно во время выполнения, но требует немного усилий.Hibernate может поддерживать программный доступ к проверкам и позволять вам переопределять аннотации, я не очень хорошо знаю API.Hibernate сам немного строит классы во время выполнения...это может быть хорошим местом, чтобы научиться это делать, если вам интересно.