我有一个对象。
public class MyObject
{
....
@Column(name = "a_number") @NotNull @NumberFormat(style = Style.NUMBER) @Min(1)
private Integer aNumber;
...
//getters and setters
}
在我的控制器中,我的对象被发布了@Valid注释。除了这个数字,我确实在类中的所有其他字段(它们的所有字符串)上进行验证。如果我从我的表单输入一个数字它工作正常,如果我违反了@Min(1)它也给了我正确的验证错误。但问题是,如果输入字符串而不是数字,则会抛出NumberFormatException。
我已经看过许多Integer和验证的例子,但如果你在发布的表单中输入一个字符串,则没有人会说明。我需要在其他位置进行验证吗? JavaScript的?我想要一个符合其余spring验证的解决方案,所以我可以在其他类中使用它。我只想说一个错误,声明它必须是数字。我也尝试使用@Pattern注释,但显然只是为了字符串。
建议?
答案 0 :(得分:9)
您可以将以下内容添加到控制错误消息的文件中(这些是在类型不匹配时查找的通用文件:
typeMismatch.commandObjectName.aNumber=You have entered an invalid number for ...
typeMismatch.aNumber=You have entered an invalid number for ...
typeMismatch.java.lang.Integer=You have input a non-numeric value into a field expecting a number...
typeMismatch=You have entered incorrect data on this page. Please fix (Catches all not found)
答案 1 :(得分:4)
对于那些在这里没有明白想法的人,可以在spring 4.2.0
中做些什么。
在messages.properties
文件夹中创建文件名WEB-INF > classes
。并将上述类型不匹配消息放在该文件中。
在spring配置或servlet.xml
文件中创建以下bean。
<beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<beans:property name="basename" value="messages"></beans:property>
</beans:bean>
对于问题中的private Integer aNumber;
等模型属性以及其他验证规则,此规则也适用于类型不匹配转换。您将在此获得所需的信息。
<form:errors path="aNumber"></form:errors>
希望它可以帮助他人。
答案 2 :(得分:0)
仍然相关,所以我将添加消息源bean定义的编程方法:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}