2011-12-30 45 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; }