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

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

Например:

public class MyPojo {
    ...

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

    ...
}

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


person Daniel Rikowski    schedule 15.04.2009    source источник


Ответы (3)


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

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

}

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

person Justin Standard    schedule 23.04.2009

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

person Pma    schedule 15.11.2010

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

person CurtainDog    schedule 15.04.2009
comment
Переопределение аннотации не работает. Один из способов настроить валидатор гибернации — написать свои собственные аннотации, но это не сработает и для того, что пытается сделать DR, потому что у вас нет доступа к динамическим значениям во время выполнения, за исключением поля аннотации. прикреплен к. Любые входные данные в аннотацию для ее настройки должны быть константами. Чтобы узнать, что сработает, ознакомьтесь с моим ответом ниже. - person Justin Standard; 23.04.2009