Spring Boot注解校验如何设置自定义字段名用于错误消息
Spring Boot JSON入参校验自定义字段友好名实现
场景说明
- 基于Spring Boot搭建的纯REST应用,无前端表单,所有接口入参均为JSON格式,采用注解方式实现参数校验
- 需求:将
email字段的对外展示名设置为E-mail address,校验失败时该名称要展示在错误提示中 - 约束:通用错误消息模板不能硬编码字段名,长度这类通用校验规则要支持复用到其他业务字段,实现类似内置
${validatedValue}的占位符能力,直接引用字段自定义展示名,最终返回的错误列表展示带友好字段名的提示 - 实测结论:无法直接为校验字段设置label属性供消息插值使用
初始状态
初始校验代码
public class Contact { @Size(max = 20, message = ErrorMessages.INVALID_LENGTH) private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } public class ErrorMessages { public static final String INVALID_LENGTH = "'${validatedValue}' must be between {min} and {max} characters long"; }
测试入参
{ "email": "tesaaaaaaaaaaaaaaaaaaaaaaaaaaaat@test.com" }
期望错误输出
{ "timestamp": "2022-06-13T00:32:28.861+00:00", "status": 400, "errors": [ "E-mail address must be between 0 and 20 characters long" ] }
初始实现的问题:通用校验模板没有字段自定义展示名的拼接能力,无法输出带友好字段名的错误提示。
最终实现方案
方案逻辑:
- 新建独立常量类统一维护所有字段的对外展示名,避免展示名散落在业务代码中
- 通用校验模板仅保留规则本身的文案,通过「字段展示名常量 + 通用模板」拼接的方式,生成每个字段专属的校验消息常量,既保证通用校验规则可复用,又不需要在模板中硬编码字段名
实现代码
字段名常量类:
public class FieldName { public static final String E_MAIL_ADDRESS = "E-mail address"; }
错误消息常量类改造:
public class ErrorMessages { private static final String INVALID_LENGTH = " '${validatedValue}' must be between {min} and {max} characters long"; public static final String E_MAIL_INVALID_LENGTH = FieldName.E_MAIL_ADDRESS + INVALID_LENGTH; }
入参类改造:
public class Contact { @Size(max = 20, message = ErrorMessages.E_MAIL_INVALID_LENGTH) private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
实际返回效果
{ "timestamp": "2022-06-13T03:27:03.207+00:00", "status": 400, "errors": [ "E-mail address 'tesaaaaaaaaaaaaaaaaaaaaaaaaaaaat@test.com' must be between 0 and 20 characters long" ] }
返回结果已自动拼接自定义的字段展示名,同时内置的${validatedValue}、{min}、{max}占位符插值逻辑正常生效,符合预期。
内容的提问来源于stack exchange,提问作者askwer
相关产品推荐
相关产品推荐

