現在、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} がドキュメントの何を参照しているかを調べる方法に関する元の質問です。