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.

JAX-RS manejo de múltiples solicitudes con la misma ruta.

Estoy desarrollando esta aplicación en JAX-RS (rest-easy) en la cual tengo una ruta de actualización PUT.

http://…/update/{resource_id}

En esta ruta puedes realizar algunas solicitudes, como ChangeNameRequest o ChangeStyleRequest, cada solicitud tiene esta estructura:

public class ChangeNameRequest{
public String newName;
}

public class ChangeStyleRequest{
public String newStyle;
}

Y luego en la clase de controlador tengo estos métodos:

@Path(“/update/{id}”)
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response changeName(ChangeNameRequest request, @PathParam(“id”) String id)

y

@Path(“/update/{id}”)
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response changeArtworkStyle(ChangeStyleRequest request, @PathParam(“id”) String id) {

El problema es que cuando hago una solicitud JSON como esta:

{
“newname” : “Nombre cambiado”
}

Elige de forma no determinista entre uno de los métodos de manejo de solicitud, lo que genera un error.

¿Cómo puedo solucionar esto? (Tal vez solo puedo agregar un campo de tipo de solicitud o algo así, pero me gustaría saber si hay algunas mejores prácticas o soluciones mejores para manejar esto).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el comportamiento no determinista de JAX-RS al elegir el método incorrecto de manejo de solicitudes, puedes diferenciar las solicitudes utilizando diferentes rutas de punto final para cada tipo de solicitud. Por ejemplo, puedes tener:

    @Path("/updateName/{id}")
    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public Response changeName(ChangeNameRequest request, @PathParam("id") String id)
    
    @Path("/updateStyle/{id}")
    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public Response changeArtworkStyle(ChangeStyleRequest request, @PathParam("id") String id)
    

    Alternativamente, si prefieres mantener la misma ruta de punto final, puedes diferenciar las solicitudes agregando un campo de tipo de solicitud en el cuerpo de la solicitud. Por ejemplo:

    public class ChangeNameRequest{
       public String request_type = "change_name";
       public String newName;
    }
    
    public class ChangeStyleRequest{
       public String request_type = "change_style";
       public String newStyle;
    }
    

    Luego, en la clase del controlador, puedes verificar el tipo de solicitud y llamar al método apropiado. Por ejemplo:

    @Path("/update/{id}")
    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public Response update(@PathParam("id") String id, Map<string, object=""> request) {
    
       String requestType = (String) request.get("request_type");
    
       if (requestType == null) {
          return Response.status(Response.Status.BAD_REQUEST).build();
       }
    
       switch (requestType) {
          case "change_name":
             ChangeNameRequest nameRequest = new ObjectMapper().convertValue(request, ChangeNameRequest.class);
             return changeName(nameRequest, id);
          case "change_style":
             ChangeStyleRequest styleRequest = new ObjectMapper().convertValue(request, ChangeStyleRequest.class);
             return changeArtworkStyle(styleRequest, id);
          default:
             return Response.status(Response.Status.BAD_REQUEST).build();
       }
    }
    

    De esta manera, puedes manejar ambas solicitudes en la misma ruta de punto final mientras las diferencias según el tipo de solicitud.</string,>

Comments are closed.