在ConstraintValidatorContext上设置插值和消息模板

时间:2013-03-20 02:27:16

标签: java bean-validation

我需要从我的自定义Validator调用validator.validateProperty()并寻找一种方法将BOTH messageTemplate和插值消息传递给ConstraintValidatorContext。 我想要实现的是,如果给定的属性具有特定值而不是另一个属性的激活验证。

MyCustomClassLevelValidator implements ConstraintValidator<Foo, Bar>{
@Autowired
private Validator validator
 public boolean isValid(Bar bar,
        ConstraintValidatorContext constraintValidatorContext){
    if(bar.isSth()){
      Set<ConstraintViolation<Bar>> somePropViolations = validator.validateProperty(bar, "someprop", Conditional.class);
      for (ConstraintViolation<Bar> propertyViolation : somePropViolations) {
         constraintValidatorContext.disableDefaultConstraintViolation();
         constraintValidatorContext.buildConstraintViolationWithTemplate(propertyViolation.getMessageTemplate()).addNode(propertyViolation.getPropertyPath().toString())
            .addConstraintViolation();
   }   
    }
 }
} 

因此,我的代码的问题是,当Bar被验证时,“someprop”上的约束违规未被完全插值(约束注释属性未被解析)

class Bar{
  ...
  @Digits(groups=Conditional.class, integer=4,fraction=0)
  String someProp;
}

所以在验证Bar之类的时候

Bar bar = new Bar();
bar.setSomeProp("99.9");
Set<ConstraintViolation<Bar>> constraintViolations = validator.validate(bar); 

我看到数值超出范围(&lt; {integer} digits&gt;。&lt; {fraction} digits&gt; expected) 代替 数值超出范围(&lt; 4位&gt;。&lt; 0 digits&gt; expected)

有没有办法在constraintValidatorContext上放置模板和消息文本(插值版本)?

1 个答案:

答案 0 :(得分:1)

我认为从约束验证器实现中回调Validator并不是一个好主意,因为这可能会在再次验证同一个对象时容易导致无限循环,该对象承载当前对象。

根据您调用验证的方式,您可以简单地将Conditional组传递给验证调用:

if(bar.isSth()) {
    Set<ConstraintViolation<Bar>> constraintViolations = 
        validator.validate(bar, Conditional.class);
}
else {
    Set<ConstraintViolation<Bar>> constraintViolations =
        validator.validate(bar);
}