簡體   English   中英

如何僅在從 spring boot 返回響應時忽略字段/列

[英]How to ignore field/column only when return response from spring boot

從 spring boot 返回響應時,我需要忽略該字段。 請找到以下信息,

我有一個名為 Student 的 pojo,如下所示

Student {
id,
name,
lastName
}

我正在為 PostRequest 獲取一個正文,如下所示

{
id:"1",
name:"Test",
lname:"Test"
}

我想從 frontEnd (id,name,Lname) 獲取所有數據,但我只想返回沒有 id 的相同 pojo 類,如下所示,

{
name:"Test",
lName:"Test"
}

我已經嘗試使用 @JsonIgnore 作為列 id,但是當我從 frontEnd 獲取數據時,它會使 id 列為 null(id=null - 即使我從郵遞員向 id 字段發送數據時也是如此)

我想只使用一個 pojo來獲取具有正確數據的數據(沒有將 id 設置為 Null),並且需要通過忽略 id 列來發回數據。

有什么辦法可以實現它而不是使用另一個 pojo?

您只需要在類級別使用 @JsonInclude(JsonInclude.Include.NON_NULL) ,這將有助於忽略所有空字段。

例如:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Test {
    // Fields
    // Constructors
    // Getters - setters
}

截至目前,您只使用一個 POJO,這不是好的做法,因為它是您項目中的主要實體,所以好的做法總是為相同的 DTO。

這可以通過 Jackson 的 @JsonView 注釋來實現。 Spring 可以利用它來定義控制器上使用的視圖。

你會像這樣定義你的 DTO 類:

class User {
    User(String internalId, String externalId, String name) {
        this.internalId = internalId;
        this.externalId = externalId;
        this.name = name;
    }
    @JsonView(User.Views.Internal.class)
    String internalId;

    @JsonView(User.Views.Public.class)
    String externalId;

    @JsonView(User.Views.Public.class)
    String name;

    static class Views {
        static class Public {

        }

        static class Internal extends Public {

        }
    }
}

Views 內部類充當 jackson 的標記,以便告訴它哪些字段包含在哪些配置中。 它不需要是內部類,但這樣可以將更短的代碼片段粘貼到此處。 由於內部擴展公開,因此選擇內部視圖時也包括公共標記的所有字段。

然后你可以像這樣定義一個控制器:

@RestController
class UserController {

    @GetMapping("/user/internal")
    @JsonView(User.Views.Internal.class)
    User getPublicUser() {
        return new User("internal", "external", "john");
    }

    @GetMapping("/user/public")
    @JsonView(User.Views.Public.class)
    User getPrivateUser() {
        return new User("internal", "external", "john");
    }
}

由於 Spring 知道 JsonView 注釋,/public 端點返回的 JSON 將僅包含 externalId 和名稱,而 /internal 端點將另外包含 internalId 字段。

請注意,如果啟用任何視圖,則不會包括沒有注釋的字段。 這種行為可以由 MapperFeature.DEFAULT_VIEW_INCLUSION 控制,當我最后一次使用它時,它在默認的 Spring ObjectMapper 中是false的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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