28

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

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

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

次のコード:

@Size(max = 5)
private String myField;

デフォルト エラーを生成します:サイズは 0 から 5 の間でなければなりません。

私はそれを望んでいます: myField のサイズは 0 から 5 の間でなければなりません。

4

9 に答える 9

32

クラスgetPropertyPath()のメソッドでフィールドの名前を取得できます。ConstraintViolation

適切なデフォルトのエラー メッセージは次のとおりです。

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

ネストされたオブジェクトの場合、「fooはnullではない可能性があります」または「foo.barはnullではない可能性があります」となります。

于 2013-08-30T14:28:57.080 に答える
4

次のように、すべてのフィールド検証メッセージをプロパティ ファイルに入れます。

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

Bean では、次のように使用します。

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

それが完璧な解決策ではないことはわかっていますが、より良い方法も見つかりません。

于 2015-04-02T08:22:36.917 に答える
0

楕円形を使用します。これには、十分な数の注釈とメッセージを表示するための可能な方法があります。

于 2012-07-11T15:49:51.987 に答える
0

バリデーター内のクラスにアクセスする方法を探しているすべての人のために。変数レベルではなくクラスレベルで休止状態の注釈を付けると、クラスオブジェクトにアクセスできるようになります(カスタムバリデーターを定義していると仮定します)。

public class myCustomValidator implements ContraintValidator <MyAnnotation, MyAnnotatedClass> {

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

    public boolean isValid (MyAnnotatedClass myAnnotatedClass) {

        // access to elements of your myAnnotatedClass

    }
} 
于 2012-09-20T15:34:12.293 に答える
0

このメソッドを使用します(例は 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());


}
于 2016-08-11T08:44:49.990 に答える