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();
   }   
    }
 }
} 

したがって、私のコードの問題は、バーが検証されたときに、「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); 

範囲外の数値 (<4 桁>.<0 桁> が必要) ではなく、範囲外の数値 (<{integer} 桁>.<{fraction} 桁> が必要) が表示される

メッセージ Template とメッセージ テキスト (補間されたバージョン) の両方を 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 に答える