如何让Jakarta Validation默认验证消息包含字段名称?
解决方案:全局配置验证消息模板,自动包含字段名
你不需要为每个验证注解手动编写自定义消息,通过Bean Validation的全局消息资源配置即可实现所有默认验证消息自动带上字段名,步骤如下:
1. 创建全局消息资源文件
在项目的src/main/resources目录下创建ValidationMessages.properties文件(这是Jakarta Bean Validation指定的默认消息配置文件)。
2. 重写默认验证注解的消息模板
在文件中为需要的验证注解配置包含字段名的消息,使用内置的{propertyPath}表达式变量(该变量会被自动替换为验证失败的字段名称,嵌套对象会包含完整路径,如user.address.address1)。示例配置如下:
# 覆盖@NotNull的默认消息 javax.validation.constraints.NotNull.message = {propertyPath} 不能为空 # 覆盖@Size的默认消息 javax.validation.constraints.Size.message = {propertyPath} 长度必须在 {min} 和 {max} 之间 # 可根据需要添加其他注解的配置,比如@NotBlank、@Min等 javax.validation.constraints.NotBlank.message = {propertyPath} 不能为空且不能仅包含空白字符 javax.validation.constraints.Min.message = {propertyPath} 不能小于 {value}
3. 验证效果
配置完成后,无需修改任何实体/record的验证注解,比如你的Address record:
public record Address( @NotNull @Size(max = 50) String address1, ... ) {}
当address1长度超过50时,错误消息会自动变为:address1 长度必须在 0 和 50 之间;如果address1为null,错误消息则为:address1 不能为空。
原理说明
Jakarta Bean Validation规范允许通过全局资源文件覆盖默认的验证消息,其中{propertyPath}是规范定义的内置表达式变量,会被验证引擎自动解析为当前验证失败的属性路径。Hibernate Validator作为规范的实现,完全支持该变量的解析,同时还提供了其他可选变量(如{validatedValue}表示被验证的实际值),可根据需求加入消息模板中。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

