2013-03-17 81 views
0

在命令bean中有一个类型为String的字段,必须按照以下顺序进行验证。Group JSR 303中的评估顺序和顺序

  • 必须包含一个值(非空)。
  • 必须正好有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。

回答

0

你的代码看起来很好,我甚至对HV 4.3.1进行了测试。它按预期工作。您正在评估默认组的权利?你有没有试过调试?

+0

你是否需要在Spring控制器类中有条件地检查 - 只检查特定的组,当其他组的约束满足时(即它们返回true)?我这样做根本不需要。您是如何在控制器(或映射到请求的其他操作类)中编码的?请告诉我。 – Tiny 2013-03-19 01:47:53

+0

除了组序列之外,当其中一个约束失败时,它们都不应被评估。这可能吗? – Tiny 2013-03-19 01:55:26

+0

您可以使用Hibernate Validator特定的[fail fast mode](失败快速模式)(http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#d0e3331),它会在第一次违反约束后停止验证内容时发生。 – Gunnar 2013-03-20 22:14:13