[英]Why 3rd party REST API's gets null values for request fields when removing @Getter Lombok annotation
我正在呼叫第三方 REST 端點。 對第三方 REST 端點的請求如下所示。
{
"body": {
"accountNumber": "12345"
},
"header": {
"username": "someusername",
"password": "somepassword"
}
}
我創建了 3 個 bean 類
我的請求.java
@Builder
@JsonDeserialize(builder = MyRequest.MyRequestBuilder.class)
public class MyRequest {
@JsonProperty("header")
private MyHeader header;
@JsonProperty("body")
private MyBody body;
}
我的身體.java
@Getter
@Builder
public class MyBody {
private String accountNumber;
}
MyHeader.java
@Getter
@Builder
public class MyHeader {
private String username;
private String password;
}
我正在使用創建請求 object
MyBody body = MyBody.builder().accountNumber("12345").build();
MyHeader header = MyHeader.builder().username("someusername").password("somepassword").build();
MyRequest request = MyRequest.builder().body(body).header(header).build();
我正在使用以下代碼調用第三部分 REST 端點
HttpEntity<MyRequest> httpEntity = new HttpEntity<>(myRequest, httpHeaders);
String url = "someurl";
someResponse = this.restTemplate.postForObject(url, httpEntity,
SomeResponse.class);
我得到了正確的回應。 但是,如果我從 MyHeader 和 MyBody 中刪除 @Getter 注釋,則第 3 方 REST 端點將在請求中獲取 null 值。 為什么這里需要@Getter。 如何在沒有@Getter 的情況下完成這項工作。
如果我從 MyHeader 和 MyBody 中刪除
@Getter
注釋,第 3 方 REST 端點將在請求中獲取 null 值。 為什么這里需要@Getter
。 如何在沒有@Getter
的情況下完成這項工作。
您需要以某種方式指示 Jackson 在序列化期間應包含哪些數據。 默認機制是為此目的使用吸氣劑。
這不是唯一的方法。
或者,您可以使用@JsonProperty
注釋某些字段,或者使用注釋@JsonAutoDetect
全局或針對特定類型更改字段的默認可見性,並將其屬性fieldVisibility
設置為ANY
(即使在沒有 getter 的情況下也可以發現這些字段)
關鍵是應該以某種方式提供關於哪些數據需要出現在序列化的 JSON 中的信息,具體如何提供並不重要。
考慮一個沒有吸氣劑的虛擬 POJO:
@AllArgsConstructor
public class Foo {
@JsonProperty
private String bar;
}
屬性bar
將反映在生成的 JSON 中。
ObjectMapper mapper = new ObjectMapper();
Foo foo = new Foo("baz");
String jsonFoo = mapper.writeValueAsString(foo);
System.out.println(jsonFoo);
Output:
{"bar":"baz"}
現在,如果我們刪除@JsonProperty
(沒有像以前那樣的吸氣劑)就會發生這種情況。
@AllArgsConstructor
public class Foo {
private String bar;
}
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Foo foo = new Foo("baz");
String jsonFoo = mapper.writeValueAsString(foo);
System.out.println(jsonFoo);
Output:
{}
一個空的 Bean 會產生一個空的 JSON(或引發異常,具體取決於配置)。 反之亦然,反序列化一個空的 JSON 給出一個空的 Bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.