简体   繁体   English

基于变量的javax Bean验证?

[英]javax Bean Validation based on variables?

Let's say I have a class with two member variables: 假设我有一个包含两个成员变量的类:

import javax.validation.constraints.Min;
class Foo {
    private int minimumAge;
    private int maximumAge;
}

I know I can validate minimum / maximum values like this: 我知道我可以像这样验证最小/最大值:

@Min(1)
private int minimumAge;

@Max(99)
private int maximumAge;

But what I really want to do, is to ensure that minimumAge is always less than or equal to maximumAge. 但我真正想做的是确保minimumAge始终小于或等于maximumAge。 So I want something like this: 所以我想要这样的东西:

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

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

But this does not seem possible with this validation framework, since it only can take constant expressions. 但是这个验证框架似乎不可能,因为它只能采用常量表达式。 Is there a way to do something like this? 有没有办法做这样的事情?

Thanks! 谢谢!

As Zack said you could use a custom constraint. 正如Zack所说,你可以使用自定义约束。

With Hibernate Validator you could alternatively work with the @ScriptAssert constraint which allows to define constraints using any JSR 223 compatible scripting engine: 使用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;

}

If you really need to declare constraints in a dynamic way you could use Hibernate Validator's API for programmatic constraint definition: 如果您确实需要以动态方式声明约束,则可以使用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();

Sounds like you may have to create a custom constraint. 听起来你可能需要创建一个自定义约束。

http://java.dzone.com/articles/using-hibernate-validator has a good section on creating (or overloading) constraints - "Customized constraints and validators" http://java.dzone.com/articles/using-hibernate-validator有一个关于创建(或重载)约束的好部分 - “自定义约束和验证器”

这也是朋友告诉我的事情,我认为这可能比@ScriptAssert方法更简单:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM