消息参数未在本地化 Spring 引导验证消息中解析

Message parameters not resolved in localized Spring Boot validation messages

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

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

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

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

我的 messages.properties 有以下条目:

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

如您所见,消息参数未被插入,而是花括号被剥离 - 当我使用 { 0} 而不是 {min} 或者当我让大小注释使用默认消息时 - javax.validation.constraints.Size.message.

能请教一下吗?

This 回答对我理解问题出在哪里有很大帮助。

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

因此应该:

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

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

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

我的期望是来自 BindingResult 的默认消息会有一个完全内插的文本,但看起来如果消息在大括号中,Hibernate 会在包中查找消息但不插入参数,而是清理字符串和剥离去掉任何大括号。