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 重复列表值

spring cloud feign client 上传文件遇到问题记录

Feign Client的使用