【问题标题】:Spring Feign Client returns null nested objectSpring Feign Client 返回空嵌套对象
【发布时间】: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 的注解,它会起作用。
  • 代码已更新。你认为还需要改变吗?

标签: json spring spring-boot rest feign


【解决方案1】:

您还应该在您的 Person 类中添加 address 属性,以及它的 getter 和 setter。我相信你一定有一个具有以下属性的地址类:

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

【讨论】:

  • 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 方法)。

如果有什么我遗漏的请评论。

感谢大家的正确回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多