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 全局负责翻译。

相关推荐
极创信息1 分钟前
信创系统认证服务怎么做?从适配到验收全流程指南
java·大数据·运维·tomcat·健康医疗
格鸰爱童话8 分钟前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
赤水无泪8 分钟前
09 C++ 11 新增的标准
开发语言
白宇横流学长27 分钟前
停车场管理系统的设计与实现
java
Flittly28 分钟前
【SpringAIAlibaba新手村系列】(18)Agent 智能体与今日菜单应用
java·spring boot·agent
格林威29 分钟前
工业相机 SDK 在 Docker 容器中的部署与权限配置(含 USB/GigE)
开发语言·人工智能·数码相机·计算机视觉·docker·容器·工业相机
哎嗨人生公众号32 分钟前
手写求导公式,让轨迹优化性能飞升,150ms变成9ms
开发语言·c++·算法·机器人·自动驾驶
code_whiter39 分钟前
C++6(模板)
开发语言·c++
一只旭宝1 小时前
【C++ 入门精讲1】初始化、const、引用、内联函数 | 超详细手写笔记(附完整代码)
开发语言·c++
木井巳1 小时前
【递归算法】目标和
java·算法·leetcode·决策树·深度优先