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
- 地址 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;
}
}
当我为前端服务添加新地址 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)。
如有遗漏之处请评论。
感谢大家的正确回复。
我有 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
- 地址 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;
}
}
当我为前端服务添加新地址 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)。
如有遗漏之处请评论。
感谢大家的正确回复。