11

この質問が以前にどこかで取り上げられていたら申し訳ありません。もしそうなら、私をリンクしてください、私はまだ満足のいく答えを見つけることができませんでした.

私は、javax 検証によって提供されるエラー メッセージをより具体的にする方法を見つけようと探し回っています。

@Min アノテーションに対して現在持っているメッセージは、ValidationMessages.properties ファイルで指定されています。

javax.validation.constraints.Min.message=The value of this variable must be less than {value}.

これは期待どおりに出力されます

The value of this variable must be less than 1

私が望むのは、メッセージに、検証に失敗した変数 (およびクラス) の名前と、失敗した変数の値も含まれていることです。もっと好きです。

The value of class.variable was 0 but not must be less than 1

どんな助けでも大歓迎です。

クレー

4

2 に答える 2

15

うーん。迷惑!ご覧のとおり、3つのオプションがあります。

  1. カスタムMessageInterpolatorを作成して検証構成に置き換えることもできますが、それは非常に脆弱なようです。

  2. @Min のスタイルで独自のカスタム アノテーションを宣言できます (カスタム バリデータの実行方法はこちらを参照) ...

  3. ..しかし、必要な情報は、実際には Validator インスタンスから出力される ConstraintViolation オブジェクト内に保持されます。デフォルトのメッセージに入れられないだけです。

現在、何らかの Web フレームワークを使用してフォームを検証していると思います。その場合、検証をオーバーライドして次のようなことを行うのは非常に簡単なはずです (クイック ハック バージョン、外部プロパティ ファイルを使用してこれを非常に整理できるはずです)。

  Set<ConstraintViolation<MyForm>> 違反 = validator.validate(form);
  for (ConstraintViolation<MyForm> cv : 違反) {
    Class<?> annoClass = cv.getConstraintDescriptor().getAnnotation().getClass();
    if (Min.class.isAssignableFrom(annoClass)) {
      文字列 errMsg = MessageFormat.format(
        "{0}.{1} の値は {2} でしたが、{3} 未満であってはなりません",
        cv.getRootBeanClass(),
        cv.getPropertyPath().toString(),
        cv.getInvalidValue()、
        cv.getConstraintDescriptor().getAttributes().get("値"));
            // errMsg をエラーとしてフォームに戻します
    }
  }
于 2011-03-08T04:11:58.727 に答える
1

カスタム制約を作成する必要があると思います。
使用している仕様の実装については言及していませんが、Hibernate Validator のカスタム制約を作成する方法に関する適切なドキュメントがここにあります

プロセスの一部には、独自の ValidationMessages.properties ファイルの作成が含まれます。

于 2011-03-08T04:02:45.110 に答える