Ограничения короткого замыкания на поле в спящем валидаторе - PullRequest
1 голос
/ 15 октября 2011

Я хочу, чтобы ограничения на поля класса были упорядочены и были закорочены, например,

@Size(min = 2, max = 10, message = "Name length improper")
@Pattern(regexp = "T.*", message = "Name doesn't start with T")
private String name;

с name="S" должно выйти из ограничения @Size и, следовательно, даже не беспокоиться о проверке следующего. Я прошел Группы, GroupSequence и Составные ограничения, но, похоже, ничего не помогло. В частности, GroupSequence не будет работать для моего случая. Учтите это:

public class Bean {

  public interface First{}
  public interface Second {}

  @GroupSequence({First.class, Second.class})
  public interface Sequence {}

  public Bean(String name, int noOfDependants) {
  ...
  }

  @Size(min = 2, max = 10, groups = {First.class})
  @Pattern(regexp = "T.*", groups = {Second.class})
  private String name;

  @Min(value = 0, groups = {First.class})
  @Max(value = 4, groups = {Second.class})
  private int noOfDependants;
}
validator.validate(new Bean("S", 5), Sequence.class)

Я ожидаю, что первое ограничение на name и второе ограничение на noOfDependants потерпит неудачу. Но, как работает GroupSequence, группа First.class потерпит неудачу, а Second.class даже не будет выполнен.

Наконец, я решил написать собственное ограничение следующим образом:

@LazySequence({
    @Size(min = 2, max = 10, message = "Name length improper"),
    @Pattern(regexp = "T.*", message = "Name doesn't start with T")
})
private String name;

и нажмите знакомую проблему Элемент аннотации, который содержит другие аннотации?

public @interface LazySequence {
    ???[] values();
    String message() default "";
    ...
 }

Кто-нибудь сталкивался с этим вариантом использования?

Thx

1 Ответ

1 голос
/ 15 октября 2011

Как указано в вопросе, который вы связали, могут быть только члены аннотации конкретного типа аннотации, поэтому нет способа, которым вы могли бы реализовать @LazySequence по назначению.

Я не совсемконечно, что вы подразумеваете под "коротким замыканием", но, основываясь на вашем описании, я думаю, что использование групповых последовательностей все еще должно работать:

public class Bean {

    public interface First {}

    public interface Second {}

    @GroupSequence({First.class, Second.class})
    public interface Sequence {}

    @Size(min = 2, max = 10, message = "Name length improper", groups = { First.class })
    @Pattern(regexp = "T.*", message = "Name doesn't start with T" , groups = { Second.class })
    private String name;

}

Когда теперь проверяется экземпляр Bean с использованием определенной последовательности (validator.validate(bean, Sequence.class)), сначала ограничение @Size будет проверено, и только в том случае, если оно выполнит ограничение @Pattern.

Подробнее о группах проверки и последовательностях групп можно узнать из спецификации Bean Validation и справочник по Hibernate Validator .

...