GroupSequence и порядок оценки в JSR 303

У меня есть поле типа String в командном компоненте, которое должно быть проверено в следующем порядке.

  • Должен содержать значение (не пустое).
  • Должно быть ровно 6 символов.
  • Необходимо подтвердить это регулярное выражение - [0-9, a-f, A-F]+

При нарушении любого из них остальные выполнять нельзя. Я попытался добиться этого, используя @GroupSequence следующим образом.

@GroupSequence({TempBean.ValidationGroupNotEmpty.class, TempBean.ValidationGroupColourHexLength.class, TempBean.ValidationGroup.class, TempBean.class})
public final class TempBean
{
    @NotEmpty(groups={ValidationGroupNotEmpty.class}, message="Must enter a valid colour code.")
    @Length(min=6, max=6, groups={ValidationGroupColourHexLength.class}, message="Requires exactly 6 characters.")
    @Pattern(groups={ValidationGroup.class}, regexp="[0-9, a-f, A-F]+", message="Invalid colour code.")
    private String stringValue;

    public interface ValidationGroup{}
    public interface ValidationGroupNotEmpty{}
    public interface ValidationGroupColourHexLength{}

    // Getters and setters.
}

Когда текстовое поле намеренно оставлено пустым, выполняется только @NotEmpty, но когда я ввожу значение, которое нарушает ограничения @Length и @Pattern, я получаю оба сообщения, как указано, что означает, что они оба оцениваются. Этого не должно случиться. Только один из них должен выполняться одновременно в определенном порядке. Как это может быть сделано?

Я использую Spring 3.2.0 и Hibernate Validator 4.3.1.


person Tiny    schedule 17.03.2013    source источник


Ответы (1)


Ваш код выглядит нормально, и я даже проверил его на HV 4.3.1. Он работает так, как ожидалось. Вы оцениваете группу Default, верно? Пробовали отлаживать?

person Hardy    schedule 18.03.2013
comment
Вам нужно было проверять условно в классе контроллера Spring, например, проверять только определенную группу, когда ограничения с другой группой (группами) удовлетворяют (т. Е. Они возвращают true)? Я делаю то, что вообще не должно быть необходимым. Как вы кодировали контроллер (или другой класс действий, который сопоставлен с запросом)? Пожалуйста, дай мне знать. - person Tiny; 19.03.2013
comment
В дополнение к групповой последовательности, когда одно из ограничений не выполняется, ни одно из них не должно оцениваться. Это возможно? - person Tiny; 19.03.2013
comment
Вы можете использовать специальный режим fail fast для Hibernate Validator., который останавливает проверку после первого нарушения ограничения. - person Gunnar; 21.03.2013
comment
@Gunnar: Не могли бы вы добавить это в качестве ответа с небольшим примером (возможно, псевдокодом)? Я не вижу в этой ссылке. - person Tiny; 13.06.2013