2009-04-15 2 views
3

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

Например:

public class MyPojo { 
    ... 

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

    ... 
} 

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

ответ

2

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

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

0

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

+0

Переопределение аннотации _wont_ work. Один из способов настройки hibernate validator - написать собственные аннотации, но это не сработает для того, что пытается сделать DR, b/c у вас нет доступа к динамическим значениям во время выполнения, за исключением поля, которое аннотация прилагается. Любые входы в аннотацию для ее настройки должны быть константами. Для чего-то, что будет работать, посмотрите мой ответ ниже. –

Смежные вопросы