【问题标题】:Message parameters not resolved in localized Spring Boot validation messages本地化 Spring Boot 验证消息中未解析的消息参数
【发布时间】:2020-02-04 01:05:46
【问题描述】:

我正在使用 Spring Boot 2.1.8 构建一个项目,我的 POM 中有 spring-boot-starter-web,我可以看到 Maven 正在拉动 hibernate-validator 6.0.17 放到类路径中。

我在资源文件夹中有我的消息,并且它们似乎被正确查找,因此当我更改语言环境时,Spring 会从正确的文件中加载消息。

我的@RestController 中的相关方法采用@Valid 和@RequestBody 注释的DTO。当 DTO 验证失败时,它会触发 ResponseEntityExceptionHandler#handleMethodArgumentNotValid() 在我的控制器建议中触发。

我的 DTO 有一个按以下方式注释的字段:

我的 messages.properties 有以下条目:

这是我的消息写入响应的方式:

如您所见,没有插入消息参数,而是去掉了大括号 - 当我使用 {0} 而不是 {min} 或当我让 Size 注释使用默认消息时 - javax.validation.constraints.Size.message。

你能建议吗?

【问题讨论】:

    标签: java spring-boot validation hibernate-validator


    【解决方案1】:

    This 的回答对我了解问题所在有很大帮助。

    要点是 Hibernate 解析的消息最终会作为 BindingResult 中的默认消息。

    因此应该:

    1. 从自定义消息中删除大括号,然后使用:
      String msg = messageSource.getMessage(e.getDefaultMessage(), e.getArguments(), locale);
    

    正确查找插入所有参数的消息。

    1. 完全放弃自定义消息并依赖 Spring 消息代码 - 例如对于 Size 注释,使用 message.properties 中的 Size.model.field 和进行查找的代码,例如:
    String msg = messageSource.getMessage(e, locale);
    

    我的期望是来自 BindingResult 的默认消息将具有完全插入的文本,但如果消息在大括号中,Hibernate 会查找包中的消息但不插入参数,而是清理字符串并剥离任何花括号。

    【讨论】:

      猜你喜欢
      • 2018-01-23
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多