Spring MVC + Hibernate验证器:如何覆盖/国际化默认错误消息?

时间:2012-06-22 07:50:28

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

我正在开发一个Spring MVC项目,我正在使用Hibernate Validator来验证表单中的输入字段。由于我的项目是基于Maven的,我添加了这种依赖:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>4.1.0.Final</version>
    </dependency>

表单验证过程正常但现在,我想覆盖或国际化默认错误消息。

例如,默认情况下,使用@NotEmpty批注将生成消息“可能不为空”。我如何通过自己的消息替换此消息?我尝试了几种解决方案:

  • 定义一个id为“messageSource”的Spring bean并设置其“basenames”属性
  • 在项目类路径中创建ValidationMessages.properties文件

但是仍会显示默认消息......

任何提示? Thx提前。

2 个答案:

答案 0 :(得分:5)

是的,你可以这样做。您可以从属性文件加载错误消息。但是你需要以正确的格式获得密钥。与NotEmpty.ClassName.fieldName=fieldName Can not be empty一样。

您只需在属性文件中指定确切的类名和属性名称即可。在你的情况下,其他一切看起来都很完美。

对于具有该注释的所有字段,您还可以为特定类型的验证注释提供常见错误消息。与javax.validation.constraints.NotNull=Notnull erro happened!

一样

希望这会对你有所帮助。欢呼声。

答案 1 :(得分:1)

这是一个解释,说明如何在给出或用于验证的每个注释后面找到确切的属性名称。见下面提到的步骤。

@Size(min = 1, max = 50, message = "Email size should be between 1 and 50")

现在从验证标记中删除{message =“电子邮件大小应介于1到50之间}。

执行此操作后,您的注释将如下所示。

@Size(min = 1, max = 50)

现在在控制器端调试提交表单时调用的方法。以下是我在用户点击提交时接收请求的方法。

public static ModelAndView processCustomerLoginRequest(IUserService userService,LoginForm loginForm, 
    HttpServletRequest request, HttpSession session, BindingResult result, String viewType, Map<String, LoginForm> model)

现在将调试点放在方法的第一行并调试参数“result”。

BindingResult result

在dubugging你会在代码数组中找到这样的字符串。

Size.loginForm.loginId

现在在属性文件中定义此字符串,并在该字符串中定义消息。编译并执行。只要不验证该注释,就会显示该消息。

Size.loginForm.loginId=email shouldn't be empty.

基本上spring将自己的字符串作为其属性文件消息的键。在上面的键

Size(@Size) = validation annotation name
loginForm = My Class Name
loginId = Property name in LoginForm class.

这种方法的美妙之处在于你将使用Spring Internationalization时运行良好。它会在语言发生变化时自动切换消息文件。