我需要从我的自定义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上放置模板和消息文本(插值版本)?
答案 0 :(得分:1)
我认为从约束验证器实现中回调Validator
并不是一个好主意,因为这可能会在再次验证同一个对象时容易导致无限循环,该对象承载当前对象。
根据您调用验证的方式,您可以简单地将Conditional
组传递给验证调用:
if(bar.isSth()) {
Set<ConstraintViolation<Bar>> constraintViolations =
validator.validate(bar, Conditional.class);
}
else {
Set<ConstraintViolation<Bar>> constraintViolations =
validator.validate(bar);
}