2013-03-17 79 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