假设我有一个包含两个成员变量的类:
import javax.validation.constraints.Min;
class Foo {
private int minimumAge;
private int maximumAge;
}
我知道我可以像这样验证最小/最大值:
@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;
但是这个验证框架似乎不可能,因为它只能采用常量表达式。有没有办法做这样的事情?
谢谢!
答案 0 :(得分:2)
正如扎克所说,你可以使用自定义约束。
使用Hibernate Validator,您也可以使用@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 Validator的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();
答案 1 :(得分:0)
听起来您可能需要创建自定义约束。
http://java.dzone.com/articles/using-hibernate-validator有一个关于创建(或重载)约束的好部分 - “自定义约束和验证器”
答案 2 :(得分:-1)
这也是朋友告诉我的,我认为这可能比@ScriptAssert方法更简单:
@AssertTrue
public boolean isValidAge() {
return minAge < maxAge;
}