2012-07-11 5 views
8

私はHibernate Validator 4.2.0.Finalを使用しています。エラーメッセージにクラスフィールド名を含める最も簡単な方法を探しています。Hibernate Validatorを使用してエラーメッセージ内にフィールド名を含める

私が見つけたものは、次のスレッドUsing a custom ResourceBundle with Hibernate Validatorです。これによると、各制約アノテーションごとにカスタムアノテーションを作成して、それぞれに1つのプロパティを追加する必要があります。

これを達成するためのよりクリーンな方法はありますか?

次のコード:

@Size(max = 5) 
private String myField; 

は、デフォルトのエラーを生成します。サイズは0と5

間でなければなりません。私はそれがしたいと思います:myFieldでサイズが0と5の間でなければなりません。

ありがとうございます。

答えて

0

バリデーター内でクラスにアクセスする方法を探しているすべての人に。可変レベルではなくクラスレベルにhibernateアノテーションを置くと、クラスオブジェクトにアクセスできます(カスタムバリデータを定義していると仮定します)。

public class myCustomValidator implements ContraintValidator <MyAnnotation, MyAnnotatedClass> { 

    public void initialize (...){ ... }; 

    public boolean isValid (MyAnnotatedClass myAnnotatedClass) { 

     // access to elements of your myAnnotatedClass 

    } 
} 
2

私は一般的な方法は認識していませんが、カスタムエラーメッセージを定義してフィールド名を含めることができます。

@Size(max = 5, message = "myField size must be between 0 and 5") 
private String myField; 
+2

なし国際その方法。 – dbreaux

0

これは注釈やメッセージを表示することが可能な方法のかなりの数を持っているovalを使用しています。

14

あなたはConstraintViolation classからgetPropertyPath()方法でフィールドの名前を取得することができます。

良いデフォルトのエラーメッセージを指定できます

violation.getPropertyPath() + " " + violation.getMessage(); 

「fooがnullでないかもしれません」、またはネストされたオブジェクトの場合には「foo.barがnullではないかもしれない」あなたを与えるだろうどの。

+0

これは私の仲間にとって完璧でした。ありがとう。 –

+0

これは一般的な使用パターンです。 – okwap

+0

特定のフィールド名を取得する方法 – DEADEND

0

私はこのように、プロパティファイルにすべてのフィールド検証メッセージを置く:

field.student.name.size.message = Student name size is not valid. 

と豆で、このようにそれを使用します。私はそれが完璧ではないことを知っている

@Size(max = 5, message = "${field.student.name.size.message}") 
private String myField; 

解決策もありますが、私はよりよい方法を見つけることもできません。

0

使用この方法(exはConstraintViolationExceptionインスタンスである):

Set<ConstraintViolation<?>> set = ex.getConstraintViolations(); 
List<ErrorField> errorFields = new ArrayList<>(set.size()); 
ErrorField field = null; 
for (Iterator<ConstraintViolation<?>> iterator = set.iterator();iterator.hasNext();) { 
    ConstraintViolation<?> next = iterator.next(); 
    System.out.println(((PathImpl)next.getPropertyPath()) 
      .getLeafNode().getName() + " " +next.getMessage()); 


} 
関連する問題