簡體   English   中英

為什么第 3 方 REST API 在刪除 @Getter Lombok 注釋時獲取請求字段的 null 值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM