Spring Feign Client 返回空嵌套对象
Posted
技术标签:
【中文标题】Spring Feign Client 返回空嵌套对象【英文标题】:Spring Feign Client returns null nested object 【发布时间】:2021-09-04 11:22:37 【问题描述】:我有 2 个服务正在运行(前端、后端)。前端服务有 Feign Client 来连接后端 API 服务。当请求到达 Frontend 时,通过 Feign 客户端到达 Backend API。
我有一个 API 端点 GET /api/v1/person,它返回如下格式的响应
"firstName": "stack"
"lastName": "overflow",
"address" :
"address1" : "xyz",
"address2" : "abc street",
"postalcode": "123456"
地址对象的数据是从外部 API 作为 JSON 字符串填充的。但是键的格式不同,所以我在 setter 和 getter 中使用 @JsonProperty 注释来正确转换它们。
class Person
private String firstName;
private String lastName;
private Address address;
public String getFirstName()
return firstName;
public void setFirstName(String firstName)
this.firstName = firstName;
public String getLastName()
return lastName;
public void setLastName(String lastName)
this.lastName = lastName;
public void setAddress(Address address)
this.address= address;
public void getAddress()
return this.address;
public class Address
private String address1;
private String address2;
private String postalCode;
@JsonProperty("address1")
public String getAddress1()
return address1;
@JsonProperty("ADD_ONE")
public void setAddress1(String address1)
this.address1 = address1;
@JsonProperty("address2")
public String getAddress2()
return address2;
@JsonProperty("ADD_TWO")
public void setAddress2(String address2)
this.address2 = address2;
@JsonProperty("postalCode")
public String getPostalCode()
return postalCode;
@JsonProperty("PST_CDE")
public void setPostalCode(String postalCode)
this.postalCode = postalCode;
从后端 API 来看,响应看起来不错且符合预期。但是当它到达前端服务时,address 对象返回为 null/empty,如下所示
"firstName": "stack"
"lastName": "overflow",
"address" :
如果我重命名 JSON 键并将 JSON 字符串转换为 java 对象,而不是在 Address 类中使用 @JsonProperty,我会得到预期的响应。
当我在 Address 类中使用 @JsonProperty 并将响应从后端传递到前端服务时,我不确定为什么它返回空或 null。
注意:响应对象对两种服务都是通用的。
有人可以告诉我,我在这里缺少什么吗?
谢谢。
【问题讨论】:
请分享地址类代码。 @VipulkumarGorasiya 更新了代码。 Getter 用于 JSON 序列化/生成,而 setter 用于从 Json 反序列化/对象创建。在您的旧代码中,您以另一种方式定义了它们。如果你切换 getter 和 setter 的注解,它会起作用。 代码已更新。你认为还需要改变吗? 【参考方案1】:您还应该在您的 Person 类中添加 address 属性,以及它的 getter 和 setter。我相信你一定有一个具有以下属性的地址类:
-
地址1
地址2
邮政编码
看看下面的代码示例。
class Person
private String firstName;
private String lastName;
private Address address;
@JsonProperty("firstName")
public String getFirstName()
return firstName;
@JsonProperty("FST_NME")
public void setFirstName(String firstName)
this.firstName = firstName;
@JsonProperty("lastName")
public String getLastName()
return lastName;
@JsonProperty("LST_NME")
public void setLastName(String lastName)
this.lastName = lastName;
public void setAddress(Address address)
this.address= address;
public void getAddress()
return this.address;
【讨论】:
yes 添加了地址类,但仍然得到一个空值。更新了代码。 你有 Address 和 Person 类中的所有 setter 和 getter 吗? 是的,并更新了对我有用的解决方案。但不确定@JsonProperty 是否导致了问题。【参考方案2】:当我为前端服务添加新的地址类时,问题得到解决。
前端服务 - 未设置注释。
public class Address
private String address1;
private String address2;
private String postalCode;
public String getAddress1()
return address1;
public void setAddress1(String address1)
this.address1 = address1;
public String getAddress2()
return address2;
public void setAddress2(String address2)
this.address2 = address2;
public String getPostalCode()
return postalCode;
public void setPostalCode(String postalCode)
this.postalCode = postalCode;
后端服务 - 使用 @JsonProperty 供 setter 和 getter 转换 JSON 键。
public class Address
private String address1;
private String address2;
private String postalCode;
@JsonProperty("address1")
public String getAddress1()
return address1;
@JsonProperty("ADD_ONE")
public void setAddress1(String address1)
this.address1 = address1;
@JsonProperty("address2")
public String getAddress2()
return address2;
@JsonProperty("ADD_TWO")
public void setAddress2(String address2)
this.address2 = address2;
@JsonProperty("postalCode")
public String getPostalCode()
return postalCode;
@JsonProperty("PST_CDE")
public void setPostalCode(String postalCode)
this.postalCode = postalCode;
由于两个服务的 Address 类都是 Common,因此出现了问题,即 Frontend 服务无法转换对象,因为 Address 类属性名称不同(使用 @JsonProperty 作为 setter 方法)。
如果有什么我遗漏的请评论。
感谢大家的正确回复。
【讨论】:
以上是关于Spring Feign Client 返回空嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章
spring cloud feign 调用返回结果为null 的原因
spring cloud feign覆写默认配置级feign client的日志打印
Spring Boot Feign Client Method 参数过多
Spring Cloud Feign Client 重复列表值