我目前正在尝试使用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.
从实验中我发现:
它将显示为The title must not be empty and must not exceed 50 characters.
,这是正确的。
但所有这些都来自实验。我想知道是否有文件说明默认约束的参数顺序?
我希望根据默认的ValidationMessages.properties使用Size.addForm.title=The title must not be empty and must not exceed {max} characters.
,但最终会在{max}
上使用NumberFormatException。我认为它与插值有关吗?
因此,每个都在{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)
这是唯一一个使用named参数的方法,必须是ValidationMessages.properties,它必须是jsr 303实现中默认资源包中存在的密钥。 :
基本上,目前的结论是,默认情况下,我不能在我的特定消息上使用命名参数。当我使用相同的默认jsr303 resourcebundle文件时,当覆盖默认jsr303 resourcebundle &amp;&amp; 上的确切键时,命名参数仅适用 name, ValidationMessages.properties
我现在更喜欢避免使用插值,因此关于如何找出{0}或{1}或{2}的原始问题是指文档中的内容。
答案 0 :(得分:4)
JSR 303 Specification,4.3.1.1。 “默认消息插值算法”
- 4 - 从消息字符串中提取消息参数。那些匹配的属性的名称 约束由约束声明中该属性的值替换。
我读到这个:你应该使用消息参数的注释属性的名称,而不是数字。
附录B规范中的“标准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验证实现接缝具有格式化值${validatedValue:<format>}
的附加功能。 - 也许这可以帮助您处理java.lang.NumberFormatException
@See Hibernate Validator Reference, Chapter 5.3. MessageInterpolator
答案 1 :(得分:0)
更好用:
@Size(max=99)
@NotBlank
private String title;
因为@Size
允许Whitespace characters
比如space
答案 2 :(得分:0)
Size.foo.bar
插值名称不起作用size.foo.bar
和baz.foo.bar
确实如此(当验证注释名称未被使用时;检查区分大小写)选中message.properties
WebAppConfig
扩展WebMvcConfigurerAdapter
中添加的 @Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
@Override
public Validator getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
文件,如:
map