1、问题描述
通过feign调用别的系统接口,发现有个属性,获取的值始终是null。 找接口提供方,提供方自测接口,是有返回值的。
2、问题排查
接口调用过程如图:
(1)接口提供方开发接口test
(2) 接口提供方往接口桩的工程,写入新提供接口的接口桩信息,并打成新的jar包发版
(3)接口调用方,maven引用接口桩的jar包。直接通过xxXtService方法调用
有问题的属性名称是
private String xName;
属性第二个字母是大写,看到这个就怀疑是因为它引起的。
Tjxx属性的get、set是通过@data自动生成。 看class类,通过@data生成的属性getXName,setXName。 通过反射生成的属性是getxName、setxName。 由此可见就是因为xName第二个字母是大写引起的问题
3、解决过程
1、接口提供方在它们系统把@data去掉,手动生成get、set,没改接口桩的get、set因为接口桩工程是全平台用,改动属性会引起其他平台改代码。
结果:还是不行,xName还是为null
2、修改接口桩工程的Tjxx
@JsonProperty("xName") private String xName;
通过 @JsonProperty
,你可以指定字段在序列化为 JSON 时应该使用的键名,或在反序列化时从 JSON 中获取值的键名
结果:接口调用方成功获取属性
4、总结
feign调用,存在序列化反序列化过程,接口返回值的属性,第二个字母最好不用大写,否则取值为null。 如果是历史接口已经是不规范的属性,可以通过加@JsonProperty方法,成功获取属性