JAVA - 使用相同的 POJO 但字段较少(没有杰克逊)

JAVA - Using same POJO but with less fields (without jackson)

我有一个由现有端点使用的 POJO,此端点使用 POJO 中存在的所有字段进行响应。
但是我正在创建一个新的 enpoint,它应该只响应同一个 POJO 的某些字段。
我想避免复制相同的 POJO 文件并删除我不需要的参数,有没有办法做到这一点?

这是 POJO:

public class AgentChatStatus {

  private UUID activeChat;
  private List<AgentChat> chatRequests; //Object with less params on new endpoint
  private List<AgentChat> chatsOnHold; //Object with less params on new endpoint
  private Collection<Agent> agents;
  private int totalChatRequests;
  private int totalChatsOnHold;
  private Preferences.AgentConsoleConfig config;
// ...
}
public class AgentChat implements Payload {
  private UUID id;
  private String queueId;

假设我只需要在端点 2 中显示“Id”,而在端点 1 中显示 id 和 queueId。 我和 spring 一起工作。 谢谢!

有了 Jackson,您可以利用 JSON 观看次数。首先是创建如下视图:

public class Views {
    public static class ViewEndpoint2 { // The name can be whatever you want
    }

    public static class ViewEndpoint1 extends ViewEndpoint2 {
    }
}

然后您需要使用 @JsonView 注释您的 POJO 中的属性,以便您告诉 Jackson 这些属性应该在哪些视图中可见:

public class AgentChatStatus {

  @JsonView(Views.ViewEndpoint2.class)
  private UUID activeChat;

  @JsonView(Views.ViewEndpoint2.class)
  private List<AgentChat> chatRequests;

  @JsonView(Views.ViewEndpoint2.class)
  private List<AgentChat> chatsOnHold;

  @JsonView(Views.ViewEndpoint2.class)
  private Collection<Agent> agents;

  @JsonView(Views.ViewEndpoint2.class)
  private int totalChatRequests;

  @JsonView(Views.ViewEndpoint2.class)
  private int totalChatsOnHold;

  @JsonView(Views.ViewEndpoint2.class)
  private Preferences.AgentConsoleConfig config;

}
public class AgentChat implements Payload {
  @JsonView(Views.ViewEndpoint2.class)
  private UUID id;

  @JsonView(Views.ViewEndpoint1.class)
  private String queueId;
}

最后,您需要用相应的视图注释端点:

@JsonView(Views.ViewEndpoint1.class)
@RequestMapping("your-old-enpoint")
public void yourOldEndpoint() {
    (...)
}

@JsonView(Views.ViewEndpoint2.class)
@RequestMapping("your-new-enpoint")
public void yourNewEndpoint() {
    (...)
}

@JsonView(Views.ViewEndpoint1.class) 基本上表示 AgentChatStatusAgentChat 中的所有属性,而 @JsonView(Views.ViewEndpoint2.class) 仅表示其中的一些属性(用 @JsonView(Views.ViewEndpoint2.class) 注释的属性)。

您可以在 https://www.baeldung.com/jackson-json-view-annotation 阅读更多相关信息。