2011-12-30 40 views
4

比方说,我有两个成员变量的类:基于变量的javax Bean验证?

​​

我知道我可以验证这样的最小值/最大值:

@Min(1) 
private int minimumAge; 

@Max(99) 
private int maximumAge; 

但我真正想要做的,是要确保那minimumAge总是小于或等于maximumAge。所以,我想是这样的:

@Min(1) 
@Max(maximumAge) 
private int minimumAge; 

@Min(minumumAge) 
@Max(99) 
private int maximumAge; 

但是这似乎并不可能与此验证框架,因为它只能采取常量表达式。有没有办法做这样的事情?

谢谢!

回答

2

使用Hibernate验证器,你可以交替使用@ScriptAssert约束,允许使用任何JSR 223兼容的脚本引擎定义约束工作:

@ScriptAssert(lang = "javascript", script = "_this.minimumAge < _this.maximumAge") 
public class MyBean { 

    @Min(1) 
    private int minimumAge; 

    @Max(99) 
    private int maximumAge; 

} 

如果你真的需要,你可以使用Hibernate一个动态的方式来声明约束验证的API对程序性约束定义:

int dynamicallyCalculatedConstraintValue = ...; 

ConstraintMapping mapping = new ConstraintMapping(); 
mapping.type(MyBean.class) 
    .property("mininumAge", FIELD) 
    .constraint(new MaxDef().value(dynamicallyCalculatedConstraintValue)); 

HibernateValidatorConfiguration config = Validation.byProvider(HibernateValidator.class).configure(); 
config.addMapping(mapping); 
Validator validator = config.buildValidatorFactory().getValidator(); 
+0

我喜欢@ScriptAssert的做法,因为它定义的约束,而无需实现自定义约束的简单,直接的方式。 – Galen 2012-01-03 17:30:39

-1

这也是一些朋友告诉我,这是我觉得可能比@Scrip更简单tAssert方法:

@AssertTrue public boolean isValidAge() { return minAge < maxAge; }