9

現在、Bean 検証を使用してカスタム検証メッセージを提供しようとしています。

現在、Spring MVC 3.1.1 + Apache Bean 検証を使用しています。

私の豆では、私は指定します:

@Size(min=1, max=50)
private String title;

そして、私の messages.properties で:

Size.addForm.title=The title must not be empty and must not exceed {1} characters.

実験から、次のことがわかりました。

  • {0} は「タイトル」を参照しています
  • {1} は最大値である 50 を指します
  • {2} は、1 である分を指します。

The title must not be empty and must not exceed 50 characters.どちらが正しいかが表示されます。

しかし、これらはすべて実験によるものです。デフォルトの制約のパラメーターの順序を示すドキュメントがあるかどうか疑問に思いますか?

うまくいけばSize.addForm.title=The title must not be empty and must not exceed {max} characters.、デフォルトの ValidationMessages.properties に基づいて使用しようとしましたが、{max}. 補間と関係があると思いますか?


アップデート

そのため、これらはそれぞれ独立して NumberFormatException で失敗します{max}

  • messages.properties : Size.addForm.title=タイトルは空であってはならず、{max}文字を超えてはなりません。
  • messages.properties : Size=タイトルを空にすることはできず、 {max}文字を超えてはなりません。
  • messages.properties : javax.validation.constraints.Size.message=タイトルは空であってはならず、{max}文字を超えてはなりません。
  • ValidationMessages.properties : Size.addForm.title=タイトルは空であってはならず、{max}文字を超えてはなりません。
  • ValidationMessages.properties : Size=タイトルは空であってはならず、{max}文字を超えてはなりません。

これはスタックトレースです:

java.lang.NumberFormatException: For input string: "max"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.text.MessageFormat.makeFormat(Unknown Source)
    at java.text.MessageFormat.applyPattern(Unknown Source)
    at java.text.MessageFormat.<init>(Unknown Source)
    at org.springframework.context.support.MessageSourceSupport.createMessageFormat(MessageSourceSupport.java:151)
    at org.springframework.context.support.ResourceBundleMessageSource.getMessageFormat(ResourceBundleMessageSource.java:281)
    at org.springframework.context.support.ResourceBundleMessageSource.resolveCode(ResourceBundleMessageSource.java:188)
    at org.springframework.context.support.AbstractMessageSource.getMessageInternal(AbstractMessageSource.java:205)
    at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:146)
    at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1214)
    at org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:571)
    at org.springframework.web.servlet.support.BindStatus.initErrorMessages(BindStatus.java:177)
    at org.springframework.web.servlet.support.BindStatus.getErrorMessages(BindStatus.java:273)
    at org.springframework.web.servlet.tags.form.ErrorsTag.exposeAttributes(ErrorsTag.java:173)
    at org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.writeTagContent(AbstractHtmlElementBodyTag.java:48)
    at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)

これは、名前付きパラメーターで機能する唯一のものであり、ValidationMessages.properties である必要があり、jsr 303 実装によってデフォルトのリソース バンドルに存在するキーと正確に一致する必要があります

  • ValidationMessages.properties : javax.validation.constraints.Size.message=ご存じのように、サイズは{min}{max}の間でなければなりません

基本的に、現在の結論は、デフォルトでは、特定のメッセージで名前付きパラメーターを使用できないということです。名前付きパラメーターは、デフォルトのjsr303リソースバンドルの正確なキーをオーバーライドする場合にのみ機能します&&同じデフォルトのjsr303リソースバンドルファイル名を使用する場合、これはValidationMessages.propertiesです

今のところ、補間をいじる必要は避けたいので、{0} または {1} または {2} がドキュメントの何を参照しているかを調べる方法に関する元の質問です。

4

3 に答える 3

4

JSR 303 仕様、4.3.1.1。「デフォルトのメッセージ補間アルゴリズム」

  • 4 - メッセージ パラメータは、メッセージ文字列から抽出されます。制約の属性の名前に一致するものは、制約宣言内のその属性の値に置き換えられます。

私はこれを次のように読みました: メッセージ パラメーターには、数値ではなく、注釈プロパティの名前を使用する必要があります。

仕様の付録 B「Standard ResourceBundle メッセージ」には、いくつかの例が示されています。

javax.validation.constraints.Min.message=must be greater than or equal to {value}
javax.validation.constraints.Max.message=must be less than or equal to {value}
javax.validation.constraints.Size.message=size must be between {min} and {max}
javax.validation.constraints.Digits.message=numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected)

したがって、名前付きパラメーターを使用する必要があるようです。(それも機能しますが{0}、実装の「機能」のようです)-しかし、結局のところ、これはデフォルトのメッセージインターポレーターの動作にすぎません。標準では、それらを独自のものに置き換える方法が定義されています。{1}{2}


アップデート

Hibernate Validation の実装には、値をフォーマットするための追加機能が組み込まれています${validatedValue:<format>}。-- 多分それはあなたのjava.lang.NumberFormatException

@See Hibernate Validator Reference, Chapter 5.3. MessageInterpolator

于 2012-05-05T17:49:25.933 に答える
0

より良い使用:

    @Size(max=99)
    @NotBlank
    private String title;

@Sizespace( ) などの空白文字を使用できるため です。

于 2016-04-05T12:42:13.080 に答える