2015-02-17 2 views
0

Я искал использование логической логики с моей проверкой bean-кода с использованием Hibernate Validator в сценариях, где AND'ing ограничений недостаточно. Я обнаружил, что можно изменить это поведение по умолчанию, создав новую аннотацию с аннотацией @ConstraintComposition как described in the documentation. В документации приведен пример.Hibernate Validator boolean logic

@ConstraintComposition(OR) 
@Pattern(regexp = "[a-z]") 
@Size(min = 2, max = 3) 
@ReportAsSingleViolation 
@Target({ METHOD, FIELD }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = { }) 
public @interface PatternOrSize { 
    String message() default "{org.hibernate.validator.referenceguide.chapter11." + 
      "booleancomposition.PatternOrSize.message}"; 

    Class<?>[] groups() default { }; 

    Class<? extends Payload>[] payload() default { }; 
} 

С помощью этого @PatternOrSize проверки ограничения означает, что входная строка либо строчные или имеет размер между 2 и 3. Теперь это поднимает несколько вопросов:

  • Я верить необходимо создать новую аннотацию для изменения поведения логической логики по умолчанию. Это верно? Если бы можно было определить логическую логику в поле класса, это было бы очень приятно, но это может быть невозможно?
  • Можно ли дополнительно настроить логическое поведение логики без создания настраиваемого валидатора, например. определяя AND и OR в то же время? Я не мог найти ничего, что подсказывает, что это возможно, но, возможно, я что-то пропустил.
  • И самое главное: Можно ли привести аргументы к @Pattern и @Size ограничениям? Потому что в противном случае я предполагаю, что мне нужно будет определить новую аннотацию для каждой комбинации аргументов, которые мне нужны. Определение новой аннотации просто для изменения аргументов до @Size не представляется возможным, но может быть необходимым?

Благодарим вас заранее.

ответ

4

Я считаю, что нужно создать новую аннотацию для изменения поведения логической логики по умолчанию. Это верно?

Да, это правильно.

Можно ли дополнительно настроить логическое поведение логики без создания настраиваемого валидатора, например. определяя AND и OR одновременно?

Возможно, вы попытаетесь создать иерархически сложенное ограничение (т. Е. Ограничение, состоящее из других ограничений), которое использует И и ИЛИ на разных уровнях. Я не пробовал (я не думаю, что у нас есть тесты для этого), но это может стоить попытки. Однако, в зависимости от требуемой логической логики, она может оказаться непригодной для использования.

Можно ли привести аргументы к ограничениям @Pattern и @Size динамическим?

Да, вы можете сделать это с помощью @OverridesAttribute:

@ConstraintComposition(OR) 
@Pattern(regexp = "[a-z]") 
@Size(min = 2, max = 3) 
@ReportAsSingleViolation 
@Target({ METHOD, FIELD }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = { }) 
public @interface PatternOrSize { 

    String message() default "..."; 
    Class<?>[] groups() default { }; 
    Class<? extends Payload>[] payload() default { }; 

    @OverridesAttribute(constraint=Size.class, name="min") 
    int min() default 0; 

    @OverridesAttribute(constraint=Size.class, name="max") 
    int max() default Integer.MAX_VALUE; 

    @OverridesAttribute(constraint=Pattern.class, name="regexp") 
    String regexp(); 
} 
+0

блестящий ответ, спасибо большое! – Andy0708

+0

@ Gunnar есть способ сделать отдельное сообщение об ошибке для каждого из этих ограничений? Рассмотрим случай: * NotNull NotEmpty *, и я хочу, чтобы NotNull был отделен от NotEmpty. – Eugene