Как я могу изменить аннотации / правила проверки Hibernate во время выполнения? - PullRequest
3 голосов
/ 15 апреля 2009

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

Например:

public class MyPojo {
    ...

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

    ...
}

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

Ответы [ 3 ]

3 голосов
/ 23 апреля 2009

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

Вот что я сделал, чтобы получить больше динамических проверок, работающих через 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 ...
    }

}

Таким образом, ваш пользовательский код проверки может содержать логику типа «Выполните эту проверку, если пользователь ее настроил, в противном случае сделайте это» и т. Д. Вы можете или не сможете использовать тот же код, который поддерживает проверки гибернации, но в любом случае то, что вы делаете, является более сложным, чем «нормальный» вариант использования для средства проверки гибернации.

1 голос
/ 15 ноября 2010

На самом деле это возможно в hibernate validator 4.1. Просто прочитайте документацию о создании программных ограничений .

0 голосов
/ 15 апреля 2009

Не думаю, что вы сможете удалить или изменить аннотацию, это часть определения класса. Вы можете создать новый класс, который возможен во время выполнения, но немного сложен. Hibernate может поддерживать программный доступ к проверкам и позволяет вам переопределять аннотации, я не очень хорошо знаю API. Hibernate сам немного строит классы времени выполнения ... это может быть хорошим местом, чтобы узнать, как это сделать, если вам интересно.

...