2011-01-04 21 views
8

エンティティの特定のフィールドが一部の条件で一意であるかどうかを確認するカスタムBean検証ツールがあります。検証に失敗した場合、メッセージには既に存在するエンティティのフィールド(IDなど)が含まれている必要があります。たとえば、メッセージは次のようになります。Bean検証メッセージの検証固有のパラメータを補間する

"Product 42 already has such a value defined, choose a unique value." 

これはBean検証を使用して可能ですか?

AFAICSは、メッセージフォーマットは、次のようなパラメータを含むことができる:

"Length must be between {min} and {max}." 

をしかし、これは、この場合には、検証アノテーションの「静的」属性を参照することができる:

@Size(min=1, max=16) 
private String name; 

で私の場合、値は私のカスタムバリデータのisValidの中でのみ知られています。

答えて

2

あなたは正しいです!あなたが望むものは、isValid()メソッドの中で制約違反メッセージを作成することができます。このために、制約注釈は、それが適用された特定のクラスに固有でなければならず、クラスレベルの検証制約でなければなりません。検証の失敗時にfalseを返す前にisValidの内部で、クラスインスタンスの値からなるメッセージを作成することができます。例:

しかし、私はフィールドレベルの注釈でこれをやりたいと思います!あなたの結果を楽しみにしていることについて私は考えていません。

+0

問題は、バリデーターに最終メッセージを構成したくないということです。フォーマット(変換用)とパラメーターのみです。しかし、私はバリデータの中にメッセージをローカライズするはずです。 – robinst

+0

私はもう一度答えを出して解決策を投稿しました。しかし、私はあなたの答えはより具体的なエラーメッセージを可能にすると考えています、ローカリゼーションがバリデーター内で行われる必要があっても、私はそれを受け入れました。 – robinst

0

それは本当に素敵な解決策ではないですが、私たちがやってしまったことは、コードを扱う当社のトップレベルの例外に次のようなもの追加しました:PrimaryKeyedがオンに使用されるカスタムインタフェースであることを

String getConstraintViolationMessages(ConstraintViolationException e) { 
    StringBuilder sb = new StringBuilder(); 
    for (ConstraintViolation<?> violation : e.getConstraintViolations()) { 
     sb.append(getMessage(violation)); 
     sb.append("\n"); 
    } 
    sb.setLength(sb.length() - 1); 
    return sb.toString(); 
} 

String getMessage(ConstraintViolation<?> violation) { 
    String key = violation.getMessageTemplate(); 
    String messageFormat = localize(key); 

    Object entity = violation.getRootBean(); 
    String identifier; 
    if (entity instanceof PrimaryKeyed) { 
     identifier = String.valueOf(((PrimaryKeyed) entity).getId()); 
    } else { 
     identifier = entity.toString(); 
    } 

    return MessageFormat.format(messageFormat, identifier); 
} 

注意を当社の事業体。また、上記以外のインターフェイスやカスタム処理もあります。

+0

これらの2つのメソッドはどのクラスにありますか?私のカスタム制約は 'context.buildConstraintViolationWithTemplate(" {no.mobitroll.rest.resources.entities.beans.validators.QuizType.enum} ")です。addConstraintViolation();'は値をまだ補間しません。 – Stephane

+0

@Stephane私たちはトップレベルの例外ハンドラクラスを持っていますが、これはおそらく無関係なものです。これを追加するところはあなたのアーキテクチャーと使用するフレームワークに大きく依存しますので、残念なことにもっと具体的な答えを与えることはできません。 – robinst

関連する問題