1

HibernateValidatorを使用しています。クラスレベルのアノテーションがあります。3つのプロパティが等しいかどうかを比較します。検証が実行されると、返されたjavax.validation.ConstraintViolationオブジェクトからPropertyPathsを取得する必要があります。これは単一のフィールドではないため、getPropertyPath()メソッドはnullを返します。PropertyPathsを見つける別の方法はありますか?

これは私のアノテーションの実装です-

@MatchField.List({
@MatchField(firstField = "firstAnswer", secondField = "secondAnswer", thirdField = "thirdAnswer"),
})
4

1 に答える 1

3

検証を行うときに拒否するプロパティにマップするようにメッセージを設定する必要があります。Hibernate Validator には、カスタム アノテーション プロパティがプロパティ パスであることを魔法のように自動的に判断する方法がありません。

public class MatchFieldValidator implements ConstraintValidator<MatchField, Object> {

  private MatchField matchField;

  @Override
  public void initialize(MatchField matchField) {
    this.matchField = matchField;
  }

  @Override
  public boolean isValid(Object obj, ConstraintValidatorContext cvc) {

    //do whatever you do
    if (validationFails) {
      cvc.buildConstraintViolationWithTemplate("YOUR FIRST ANSWER INPUT IS WRONG!!!").
                        addNode(matchField.firstAnswer()).addConstraintViolation();
      cvc.buildConstraintViolationWithTemplate("YOUR SECOND ANSWER INPUT IS WRONG!!!").
                        addNode(matchField.secondAnswer()).addConstraintViolation();
      //you get the idea
      cvc.disableDefaultConstraintViolation();
      return false;
    }
  }
}
于 2011-06-09T18:48:50.700 に答える