Java后端接口字段命名转换:蛇形与驼峰式自动映射技术

结论先行:

前端统一 snake_case,后端统一 camelCase,由 Jackson 全局自动完成双向映射。

这是 Jackson 层面的统一协议问题,不应该在 DTO/VO 上"手工处理"。

在 大项目体量里,必须做到全局自动转换、零侵入、零重复注解

一、核心机制:Jackson 命名策略(双向自动)

Jackson 原生支持 序列化 & 反序列化同时生效

场景 行为
Request JSON → Java DTO access_tokenaccessToken
Java VO → Response JSON accessTokenaccess_token

无需在字段上写任何注解

二、推荐方案(全局配置,唯一入口)

1. application.yml(首选,最干净)

yaml 复制代码
spring:
  jackson:
    property-naming-strategy: SNAKE_CASE

这一行就够了。

2. 等价 Java 配置(如果你偏代码化)

java 复制代码
@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
        return mapper;
    }
}

建议用 yml,避免 ObjectMapper 多实例污染。

三、示例:LoginRequest / LoginVO

1. LoginRequest(后端代码,驼峰)

java 复制代码
public class LoginRequest {

    private String account;
    private String password;
    private String loginType;
}

前端请求 JSON(下划线)

json 复制代码
{
  "account": "13800138000",
  "password": "123456",
  "login_type": "PASSWORD"
}

Jackson 自动映射为:

java 复制代码
loginRequest.getLoginType(); // PASSWORD

2. LoginVO(后端代码,驼峰)

java 复制代码
public class LoginVO {

    private String accessToken;
    private String refreshToken;
    private Long expiresIn;
}

返回给前端 JSON(自动下划线)

json 复制代码
{
  "access_token": "xxx",
  "refresh_token": "yyy",
  "expires_in": 7200
}

四、为什么这是大项目必须采用的方式

1. 前端世界就是 snake_case

  • iOS / Android / 小程序 / OpenAPI
  • 多语言 SDK 生成器默认 snake_case
  • JSON Schema / OpenAPI 更友好

2. Java 世界必须 camelCase

  • Lombok / Bean 规范
  • MyBatis / MapStruct
  • IDE 自动补全

3. 中间层自动转换,才是工业级解法

五、禁止的"反模式"(踩一个就会后悔)

❌ 每个字段写 @JsonProperty

java 复制代码
@JsonProperty("access_token")
private String accessToken;

问题:

  • DTO 爆炸
  • 重构成本极高
  • 其他开发人员一定骂你

❌ Request / Response 分两套字段名

java 复制代码
private String access_token;

问题:

  • Java 规范被破坏
  • IDE / Lombok / Mapper 全部痛苦

六、特殊情况如何处理(白名单)

1. 单字段例外

java 复制代码
@JsonProperty("openid")
private String openId;

只在:

  • 第三方强绑定字段
  • 历史兼容接口

2. 禁止自动转换的字段

java 复制代码
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy.class)
public class ThirdPartyCallbackRequest {
}

七、与 Swagger / OpenAPI 的一致性

启用后:

  • Swagger 显示字段名:access_token
  • 后端字段:accessToken
  • 文档 = 实际接口

八、最终统一规范(一句话版)

后端代码只写驼峰;
API 协议只暴露下划线;
Jackson 全局负责翻译。

相关推荐
小途软件16 小时前
用于机器人电池电量预测的Sarsa强化学习混合集成方法
java·人工智能·pytorch·python·深度学习·语言模型
alonewolf_9916 小时前
Spring MVC启动与请求处理全流程解析:从DispatcherServlet到HandlerAdapter
java·spring·mvc
Echo娴16 小时前
Spring的开发步骤
java·后端·spring
吴声子夜歌17 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
wanglei20070817 小时前
生产者消费者
开发语言·python
_UMR_17 小时前
springboot集成Jasypt实现配置文件启动时自动解密-ENC
java·spring boot·后端
程序员小假17 小时前
我们来说说 Cookie、Session、Token、JWT
java·后端
leo__52018 小时前
基于菲涅耳衍射积分的空心高斯光束传输数值模拟(MATLAB实现)
开发语言·matlab
昵称已被吞噬~‘(*@﹏@*)’~18 小时前
【RL+空战】学习记录03:基于JSBSim构造简易空空导弹模型,并结合python接口调用测试
开发语言·人工智能·python·学习·深度强化学习·jsbsim·空战
短剑重铸之日18 小时前
《SpringBoot4.0初识》第一篇:前瞻与思想
java·开发语言·后端·spring·springboot4.0