2013-01-13 47 views
0

我有一個類:一個字段上有兩個hibernate驗證器。需要選擇只有一個

public class Foo { 
    @Length(min = 6, max = 30) 
    @Pattern(regexp = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*)", message = "{error.password.too_simple}") 
    private String password; 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

正如你看到的,有一個字段「密碼」和兩個驗證註解。但是,在某些情況下,我希望只有一個應用,而不是兩個。 例如:如果我有空字符串:「」我想,只有一個限制適用:第一個(@Length),但在我的情況適用這兩個限制。 我該怎麼做,我怎麼能在這種情況下只應用一個限制?

+1

如果您熟悉HibernateValidator的自定義驗證,那麼您可以按照您的需求自定義驗證,如[this](http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html /validator-customconstraints.html#validator-customconstraints-validator)。 **這僅僅是一個例子**。如果你打算第一次做,可能需要一些時間。您還需要在需要時學習驗證組(並且必須要求,如果您自定義驗證)。 – Lion

回答

3

您可以將約束分配給不同的validation groups,並使用組序列對其進行驗證。通過重新定義default group sequenceFoo

public interface EmptyChecks {} 

@GroupSequence({ EmptyChecks.class, Foo.class }) 
public class Foo { 
    @Length(min = 6, max = 30, groups=EmptyChecks.class) 
    @Pattern(regexp = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*)", message = "{error.password.too_simple}") 
    private String password; 

    //... 
} 

現在@Pattern約束將僅在@Length約束是有效的驗證。

您的具體情況也可能是由於在@Password約束的正則表達式接受一個空值(^$)解決:

@Pattern(regexp = "(^$|(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*)", message = "") 

這樣既限制將被驗證,但只有@Length約束將失敗一個輸入值。

+0

非常感謝!但是,如果我想限制不爲空的String。我想將reg exp應用於長度從6到30的任何單詞。在其他情況下,應該應用* @長度*限制? – Andrew

相關問題