我目前正在尝试使用 bean 验证提供自定义验证消息。
目前使用 spring mvc 3.1.1 + apache bean 验证。
在我的 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=你知道wad,大小必须在{min}和{max}之间
基本上目前的结论是,默认情况下,我不能在我的特定消息上使用命名参数。命名参数仅在我使用相同的默认 jsr303 资源包文件名(即ValidationMessages.properties )覆盖默认 jsr303 资源包&&上的确切键时才有效
我现在更喜欢避免使用插值,因此关于如何找出 {0} 或 {1} 或 {2} 的原始问题是指文档中的内容。