0

我需要从我的自定义 Validator 调用 validator.validateProperty() 并寻找一种将 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); 

我看到数值超出范围(<{integer} 位>.<{fraction} 位> 预期)而不是数值超出范围(<4 位>.<0 位> 预期)

有什么方法可以将消息模板和消息文本(插值版本)都放在 constraintValidatorContext 上?

4

1 回答 1

1

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

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

if(bar.isSth()) {
    Set<ConstraintViolation<Bar>> constraintViolations = 
        validator.validate(bar, Conditional.class);
}
else {
    Set<ConstraintViolation<Bar>> constraintViolations =
        validator.validate(bar);
}
于 2013-03-20T22:10:07.030 回答