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

标签 java spring-boot validation hibernate-validator

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

我的消息位于资源文件夹中,并且它们似乎已正确查找,因此当我更改区域设置时,Spring 会从正确的文件加载消息。

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

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

我的 messages.properties 具有以下条目:

enter image description here

这就是我的消息写入响应的方式: enter image description here

如您所见,消息参数未进行插值,而是大括号被删除 - 当我使用 {0} 而不是 {min} 或当我让 Size 注释使用默认消息 - javax.validation.constraints.Size.message 时。

您能指点一下吗?

最佳答案

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

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

因此,人们应该:

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

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

或者

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

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

    关于java - 本地化 Spring Boot 验证消息中的消息参数未解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58257635/

    相关文章:

    java - 部署 Spring Boot 1.3.2 IBM WAS 8.5

    java - 如何在 Apache 访问日志中包含精确到毫秒的时间格式

    groovy - Groovy 中的 Spring Boot 外部配置

    c# - INotifyDataErrorInfo。 ErrorsChanged 如何使 wpf 显示属性错误,如 `Address.Country`

    php - JSON 架构验证 : validate array of objects

    wpf - 在 View 模型中验证 DateTime 属性

    java - AWS Neptune io.netty.handler.codec.CorruptedFrameException

    java - SSL 有两种方式不适用于我的 OpenLDAP

    java - 如何在 Spring Boot Java 中运行多个监听器?

    java - 如何使用 Apache Camel REST DSL (Servlet/ReSTLet) 设置 HTTP 状态代码原因