首页 > 基础资料 博客日记

踩坑实录:接口正常Feign调用字段值为空

2026-05-26 13:30:02基础资料围观12

文章踩坑实录:接口正常Feign调用字段值为空分享给大家,欢迎收藏极客资料网,专注分享技术知识

Feign字段取不到值问题解析

Postman直接调用接口时数据正常,但通过Feign调用时字段值却为null。起初怀疑是Feign配置问题,经过排查后才发现问题出在字段命名上——mName这类单字母驼峰命名被Jackson按规范推断为MName,导致大小写不匹配。

这种约定冲突比技术难点更难防范,耗费了半小时才搞清楚原因。

问题现象

接口返回的客户信息如下:

{
    "mName": "51石雷",
    "cAddr": "张东路1387号"
}

对应的实体类定义为:

@Data
public class CustomerInfo {
    private String mName;
    private String cAddr;
}

从表面上看,字段名与JSON中的键值一一对应,似乎没有问题。然而,实际测试发现mNamecAddr的值始终为null,而其他字段则正常。

问题排除

首先排除了接口本身的问题。通过Postman直接调用接口,数据能够正常返回,确认JSON字段名确实是"mName""cAddr"。由此判断,问题出在反序列化环节。

根本原因:Jackson的属性名推断机制

Jackson在反序列化过程中,并不直接根据字段名进行映射,而是基于getter/setter方法名进行推断。

对于字段mName,Lombok生成的getter方法如下:

public String getMName() {
    return this.mName;
}

这里需要特别注意JavaBeans规范的一个特殊规则:当属性名的第二个字母为大写时,getter/setter方法的首字母也需要大写。

字段名 标准Getter方法 Jackson推断的属性名
name getName() name
mName getMName() MName

Jackson看到getMName()方法,会按照规范推断属性名为MName,而JSON中实际使用的是"mName",由于大小写不匹配,导致反序列化失败。

命名习惯的由来

这种单字母前缀加驼峰的命名方式源于老系统的编码习惯:

  • mName = member name(会员名称)
  • cAddr = company address(公司地址)
  • pId = person id(人员ID)

当时可能认为这种命名方式简洁明了,但现在却成为了潜在的问题源。这并非系统bug,而是历史遗留问题。

解决方案:使用@JsonProperty注解

最直接的解决方案是通过@JsonProperty注解显式指定JSON字段名,绕过Jackson的自动推断机制:

@Data
public class CustomerInfoResponse {
    @JsonProperty("mName")
    private String mName;

    @JsonProperty("cAddr")
    private String cAddr;
}

这种方法改动最小,且保持了向后兼容性。

最佳实践建议

场景 建议
新项目开发 避免使用单字母开头的驼峰命名,采用完整的单词进行命名
对接老系统 检查字段命名格式,对mName这类特殊命名字段直接添加@JsonProperty注解
大量特殊字段 考虑全局配置Jackson的命名策略,统一处理特殊情况

总结而言,对接老系统时遇到的问题往往不是技术难点,而是命名习惯的冲突。Jackson严格按照规范处理数据,而老系统遵循特定的命名习惯——双方都没有错,只是无法匹配。在开发过程中,了解这些底层机制有助于更快定位和解决问题。


文章来源:https://www.cnblogs.com/gloamfox/p/20169340
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云