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

相关推荐
Bs_MoneyMagnet5 分钟前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
麻瓜code20 分钟前
【JUC】AQS enq() 自旋入队
java
Zenova EdgeOS25 分钟前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
Wang's Blog40 分钟前
Java框架快速入门: Spring Security+OAuth2之核心角色与授权流程
java·spring·github
hai_android1 小时前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
caoerzhong1 小时前
JeeWMS 开源仓库管理系统权限与域验证解析:Java WMS 如何把数据权限管到仓、货主与人
java·python·开源·vue
君顾11 小时前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
用户094248568031 小时前
第9章:OpenJDK堆分代与 Serial/Parallel GC 基础
java·jvm
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之RBAC与角色分层实践
java·网络·spring
caoerzhong1 小时前
JeeWMS 开源仓库管理系统多租户架构解析:一套 Java WMS 如何同时服务多个货主与多个仓库
java·架构·开源·vue