Как я могу изменить правила проверки аннотаций/Hibernate во время выполнения?

StackOverflow https://stackoverflow.com/questions/750890

Вопрос

Если у вас есть класс Java с некоторыми полями, я хочу проверить их с помощью Hibernate Validator.Теперь я хочу, чтобы мои пользователи могли настраивать во время выполнения, какие проверки будут выполняться.

Например:

public class MyPojo {
    ...

    @NotEmpty
    String void getMyField() {
        ... 
    }

    ...
}

Допустим, я хочу удалить NotEmpty проверьте или замените его на Email или CreditCardNumber, как мне это сделать?Возможно ли это вообще?Я думаю, это сводится к изменению аннотаций во время выполнения...

Это было полезно?

Решение

Вы не можете сделать это нормально.

Вот что я сделал, чтобы обеспечить более динамичную проверку через Hibernate Validator.

  1. Расширить ClassValidator сорт.
  2. Переопределить getInvalidVaues(Object myObj) метод.Сначала позвоните super.getInvalidValues(myObj), затем добавьте перехватчик в свою настроенную проверку.
  3. Создайте экземпляр своего собственного валидатора и позвоните 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 сам немного строит классы во время выполнения...это может быть хорошим местом, чтобы научиться это делать, если вам интересно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top