es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

JAVA – Utilizando el mismo POJO pero con menos campos (sin jackson)

Tengo un POJO utilizado por un punto final existente, este punto final responde con todos los campos presentes en el POJO.
Pero estoy creando un nuevo punto final que debería responder solo con algunos campos del mismo POJO.
Quiero evitar copiar el mismo archivo POJO y eliminar los parámetros que no necesito, ¿hay alguna forma de hacer esto?

Este es el POJO:

public class AgentChatStatus {

private UUID activeChat;
private List<agentchat> chatRequests; //Objeto con menos parámetros en el nuevo punto final
private List<agentchat> chatsOnHold; //Objeto con menos parámetros en el nuevo punto final
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;

Digamos que solo necesito mostrar “Id” en el punto final 2 pero “id” y “queueId” en el punto final 1.
Trabajo con spring por cierto.
¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de lograr esto en Java utilizando la biblioteca JSON Jackson de Spring.

    Puedes utilizar la función “JsonView” de Jackson para especificar qué campos deben incluirse o excluirse de la serialización de un objeto.

    Primero, debes definir dos vistas en tu POJO utilizando anotaciones:

    public class AgentChatStatus {
    
       public interface Endpoint1View {}
    
       public interface Endpoint2View {}
    
       @JsonView(Endpoint1View.class)
       private UUID activeChat;
    
       @JsonView(Endpoint1View.class)
       private List<agentchat> chatRequests;
    
       @JsonView(Endpoint1View.class)
       private List<agentchat> chatsOnHold;
    
       @JsonView(Endpoint1View.class)
       private Collection<agent> agents;
    
       @JsonView(Endpoint1View.class)
       private int totalChatRequests;
    
       @JsonView(Endpoint1View.class)
       private int totalChatsOnHold;
    
       @JsonView(Endpoint1View.class)
       private Preferences.AgentConsoleConfig config;
    
       @JsonView(Endpoint2View.class)
       private UUID activeChat;
    
       @JsonView(Endpoint2View.class)
       private List<agentchat> chatRequests;
    
       @JsonView(Endpoint2View.class)
       private List<agentchat> chatsOnHold;
    
       @JsonView(Endpoint2View.class)
       private int totalChatRequests;
    
       @JsonView(Endpoint2View.class)
       private int totalChatsOnHold;
    
       @JsonView(Endpoint2View.class)
       private Preferences.AgentConsoleConfig config;
    
       // ...
    }
    

    Luego, en tu controlador, puedes anotar los métodos que manejan las solicitudes a endpoint1 y endpoint2 con la anotación @JsonView especificando las diferentes vistas:

    @RestController
    @RequestMapping("/endpoint")
    public class MyController {
    
       @JsonView(AgentChatStatus.Endpoint1View.class)
       @GetMapping("/endpoint1")
       public AgentChatStatus getEndpoint1() {
           // Lógica para obtener el objeto AgentChatStatus
       }
    
       @JsonView(AgentChatStatus.Endpoint2View.class)
       @GetMapping("/endpoint2")
       public AgentChatStatus getEndpoint2() {
           // Lógica para obtener el objeto AgentChatStatus
       }
    }
    

    De esta manera, el endpoint1 getEndpoint1() solo devolverá los campos con la anotación Endpoint1View y el endpoint2 getEndpoint2() solo devolverá los campos con la anotación Endpoint2View.

Comments are closed.