使用自定义消息进行JSR-303验证

时间:2011-04-21 00:40:22

标签: spring-mvc hibernate-validator bean-validation

我正在使用Spring 3.0.5-RELEASE,JSR-303样式验证和Hibernate验证器4.1.0-Final。我的模型类看起来像这样:

public class Model {
    @Max(value=10,message="give a lower value")
    Integer n;
}

这在带有绑定的spring mvc servlet中作为请求参数传递。所以请求看起来像这样:

http://localhost:8080/path?n=10

我想要的是能够在存在类型不匹配异常时自定义错误消息,例如:

http://localhost:8080/path?n=somestring

这导致我要替换的很长的默认消息。

我已经尝试了网络上描述的所有配置,但它们似乎都不起作用。有人知道正确的配置是什么吗?

具体来说,我的mvc-servlet.xml需要什么?我的messages.properties文件需要什么? message.properties文件是否具有魔术名称,以便hibernate-validator能够找到它?

我在mvc-servlet.xml中使用了以下内容但没有成功:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource" p:basename="messages" />

在src / main / resources(以及src / main / webapp / WEB-INF)上的messages.properties文件......

我在messages.properties中尝试过各种各样的组合,甚至可以简单地覆盖@NotEmpty消息,甚至对我来说也不行。

4 个答案:

答案 0 :(得分:8)

错误消息需要进入名为ValidationMessages.properties的文件。只需将它放在hibernate jar之前的类路径中。

例如,如果您的ValidationMessages.properties文件包含以下属性:

email_invalid_error_message=Sorry you entered an invalid email address
email_blank_error_message=Please enter an email address

然后你可以拥有一个具有以下约束的域对象:

public class DomainObject{ 
...
@Email(message = "{email_invalid_error_message}")
@NotNull(message = "{email_blank_error_essage}")
@Column(unique = true, nullable = false)
String primaryEmail;
...
}

答案 1 :(得分:4)

我在另一个问题中找到了答案,这对我有用: spring 3.0 MVC seems to be ignoring messages.properties

对我来说,令人困惑的部分,因为我是Spring的新手,我希望能够将消息放在ValidationMessages.properties中。但是,此错误发生在绑定时,在验证之前。因此,不要使用ValidationMessages.properties,而是使用常规的ResourceBundle messages.properties文件。

将它放在你的?? - servlet.xml文件中:

<bean id="messageSource" 
 class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages"/> </bean>

将这些行放在messages.properties文件中。

typeMismatch.myRequest.amount=Amount should be a number.
methodInvocation.myRequest.amount=Amount should be a number.

在此示例中,myRequest是我的表单模型,amount是该表单中的属性。 typeMismatch和methodInvocation是预定义的,对应于绑定/转换异常,就像您似乎得到的那样。我很难找到他们的好文档或值列表,但我发现它们在一些Spring异常中对应于ERROR_CODE常量。 http://static.springsource.org/spring/docs/2.5.x/api/constant-values.html#org.springframework.beans.MethodInvocationException.ERROR_CODE

我将此项目的messages.properties文件放在我的源文件夹的根目录中,该文件夹将它放在我的类路径的根目录中,以及ValidationMessages.properties。

答案 2 :(得分:2)

  

我想要的是能够在存在类型不匹配异常时自定义错误消息,例如

据我了解Spring MVC生成的消息,而不是Hibernate Validator生成的消息。我建议在messages.properties文件中添加以下行:

typeMismatch.java.lang.Integer=Must specify an integer value

答案 3 :(得分:0)

问题是数据绑定错误消息而不是验证错误消息。有足够的答案here