【问题标题】:Spring MVC + Hibernate validator : how can I override/internationalize the default error messages?Spring MVC + Hibernate 验证器:如何覆盖/国际化默认错误消息?
【发布时间】:2012-06-24 12:22:26
【问题描述】:

我正在开发一个 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 文件

但仍显示默认消息...

有什么提示吗? 提前谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    希望这对您有所帮助。干杯。

    【讨论】:

    • 谢谢,您的回答帮助我找到了一个令人满意的解决方案:我只需要在我的类路径中添加一个名为“ValidationMessages.properties”的属性文件。然后,我可以添加指向每个验证注释的值(例如:org.hibernate.validator.constraints.NotEmpty.message=my message),或者在括号中定义我自己的键,并在属性文件中使用这个键。跨度>
    • @KHY 为休眠验证器设置通用消息正是我所追求的。另请注意,您可以将@NotEmpty(message="xyz {use.braces.for.bundle.keys}") 作为内联Java 代码,然后将use.braces.for.bundle.keys=Hey guy, remember to use braces! 作为ValidationMessages.properties 文件的一行。在我看来,这对于无效的日期格式很好 @Pattern(regexp="\\d{4}-\\d{2}-\\d{2}", message="{Invalid.Date.UseYMDFormat}")
    • 这帮助我查看了覆盖默认值的所有错误消息:silverbaytech.com/2013/04/16/…
    • 很高兴知道这对您有所帮助。 :)
    • 在回答之后,我首先尝试了 javax.validation.constraints.NotNull 消息键,但它没有用。然后我从 kiiu 那里得到了提示,并使用了 org.hibernate.validator.constraints.NotEmpty.message 消息键,它起作用了。我暂时不使用 Spring。
    【解决方案2】:

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

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

    现在从验证标签中删除 { message = "Email size should be between 1 and 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
    

    调试时你会在codes数组中找到这样的字符串。

    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 国际化时也运行良好。它会随着语言的变化自动切换消息文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多