2013-01-13 48 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

相关问题