You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:36:17