消息参数未在本地化 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 中的默认消息。
因此应该:
- 从自定义消息中删除大括号,然后使用:
String msg = messageSource.getMessage(e.getDefaultMessage(), e.getArguments(), locale);
正确查找内插所有参数的消息。
或
- 完全放弃自定义消息并依赖 Spring 消息代码 - 例如对于大小注释,使用 Size.model.field in message.properties 和执行查找的代码,例如:
String msg = messageSource.getMessage(e, locale);
我的期望是来自 BindingResult 的默认消息会有一个完全内插的文本,但看起来如果消息在大括号中,Hibernate 会在包中查找消息但不插入参数,而是清理字符串和剥离去掉任何大括号。
我正在使用 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 中的默认消息。
因此应该:
- 从自定义消息中删除大括号,然后使用:
String msg = messageSource.getMessage(e.getDefaultMessage(), e.getArguments(), locale);
正确查找内插所有参数的消息。
或
- 完全放弃自定义消息并依赖 Spring 消息代码 - 例如对于大小注释,使用 Size.model.field in message.properties 和执行查找的代码,例如:
String msg = messageSource.getMessage(e, locale);
我的期望是来自 BindingResult 的默认消息会有一个完全内插的文本,但看起来如果消息在大括号中,Hibernate 会在包中查找消息但不插入参数,而是清理字符串和剥离去掉任何大括号。