一尘不染

本地化的Spring Boot验证消息中未解析消息参数

spring-boot

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

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

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

如您所见,消息参数未插入,而是大括号被剥夺了 -当我使用{0}而不是{min}或让Size注释使用默认消息javax.validation.constraints时,也会发生同样的情况。大小消息。

你能给些建议么?


阅读 241

收藏
2020-05-30

共1个答案

一尘不染

这个答案帮助我了解了问题所在。

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

因此,应该:

从自定义消息中删除括号,然后使用:

  String msg = messageSource.getMessage(e.getDefaultMessage(), e.getArguments(), locale);
  1. 要正确查找内插所有参数的消息。

要么

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

我的期望是,来自BindingResult的默认消息将具有完全内插的文本,但是看来,如果该消息位于括号中,则Hibernate会在捆绑包中查找该消息,但不对参数进行插值,而是清理字符串并剥离所有花括号。

2020-05-30