Spring Feign Client returns 空嵌套对象

Spring Feign Client returns null nested object

我有 2 个服务 运行(前端、后端)。前端服务有 Feign 客户端连接到后端 API 服务。当请求到达前端时,通过 Feign 客户端它到达后端 API.

我有一个 API 端点 GET /api/v1/person returns 响应格式如下

{
  "firstName": "stack"
  "lastName": "overflow",
  "address" : {
       "address1" : "xyz",
       "address2" : "abc street",
       "postalcode": "123456"
   }
}

地址对象的数据作为 JSON 字符串从外部 API 填充。但是键的格式不同,所以我在 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 对象,而不是在地址 class 中使用 @JsonProperty,我会得到预期的响应。

当我在地址 class 中使用 @JsonProperty 并将响应从后端传递到前端服务时,我不确定为什么它 returns 为空或 null。

注意:两种服务的响应对象是通用的。

有人可以告诉我,我在这里缺少什么吗?

谢谢。

您还应该在 Person class 中添加地址属性及其 getter 和 setter。我相信您的地址 class 一定具有以下属性:

  1. 地址 1
  2. 地址 2
  3. 邮政编码

查看下面的代码示例。

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;
    }
}

当我为前端服务添加新地址 class 后,问题已解决。

前端服务 - 未设置注释。

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;
    }
}

后端服务 - 使用用于 setter 的 @JsonProperty 和 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;
    }
}

由于两个服务的地址 class 是通用的,因此出现了问题,即前端服务无法转换对象,因为地址 class 属性名称不同(使用@ setter 方法的 JsonProperty)。

如有遗漏之处请评论。

感谢大家的正确回复。