2011-04-05 3 views
11

Perdóneme, pero puede que no esté familiarizado con toda la jerga necesaria para hacer esta pregunta correctamente.Cambiar el tipo de contenido en el servicio REST de jax-rs

Estoy trabajando en un servicio web REST bastante simple en Java utilizando la implementación org.apache.cxf.jaxrs.ext de jax-rs. La cabecera del método es la siguiente:

@GET 
@Path("json/{fullAlias}") 
@Produces({"application/json"}) 
public String json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req) 

donde MessageContext es org.apache.cxf.jaxrs.ext.MessageContext.

Hay dos cosas que estoy tratando de lograr que me parece que no puede averiguar:

  1. Cambiar el tipo de contenido si se cumplen ciertas condiciones (por ejemplo, para un error)
  2. Cambio el código de estado de la respuesta

he intentado usar el cambio de la respuesta de acceder a él a través de la MessageContext:

HttpServletResponse response = req.getHttpServletResponse(); 
response.setContentType("text/plain") 
response.setStatus("HttpServletResponse.SC_BAD_REQUEST); 

Pero estos cambios no influyen en la respuesta enviada; con o sin la anotación @Produces, establecer el tipo de contenido dentro del método no afecta el tipo de contenido real (con la anotación, por supuesto devuelve "application/json", sin que por defecto sea "text/html").

Estoy devolviendo una cadena simple como el cuerpo. He entretenido tratando de devolver un objeto javax.ws.rs.core.Response para hacer lo que quiero, pero no sé mucho al respecto.

¿Cómo cambiaría el tipo de contenido y/o los códigos de estado de este método?

Respuesta

28

Un enfoque consiste en lanzar una WebApplicationException, tal como describe Pace, que funcionará si está buscando manejar específicamente un error. Si está buscando poder cambiar su contenido en cualquier momento por cualquier motivo, entonces querrá revisar una respuesta como resultado de su método de servicio en lugar de una cadena. Devolver una respuesta le proporciona la mayor cantidad de control sobre cómo responde su servicio a la solicitud del cliente (requiere más código que devolver una cadena simple).

Aquí es un ejemplo de cómo se puede hacer uso del objeto Response:

@GET 
@Path("json/{fullAlias}") 
public Response json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req) { 
    ... 
    if (success) { 
     ResponseBuilder rBuild = Response.ok(responseData, MediaType.APPLICATION_JSON); 
     return rBuild.build(); 
    } 
    else { 
     ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST); 
     return rBuild.type(MediaType.TEXT_PLAIN) 
        .entity("error message") 
        .build(); 
    }  
} 
+0

¡Gracias!Me preguntaba si algo como esto funcionaría, pero me dejas saber cómo hacerlo. – Indigenuity

1

No estoy seguro si es el mejor enfoque pero he hecho lo siguiente para resolver su pregunta n. ° 1.

public WebApplicationException createStatusException(String statusMessage) { 
    ResponseBuilder rb = Response.noContent(); 
    rb = rb.type(MediaType.TEXT_PLAIN); 
    rb = rb.status(Status.BAD_REQUEST); 
    rb = rb.entity(statusMessage); 
    return new WebApplicationException(rb.build()); 
} 

EDIT: I luego lanzó la WebApplicationException resultante.

+0

Esto funciona mejor que otra semi-solución que acabo de probar: response.sendError (HttpServletResponse.SC_BAD_REQUEST, "mensaje aquí"); Esto simplemente cometió una respuesta, y el método se dejó funcionando después de que el cliente ya había recibido una respuesta. – Indigenuity

0

Usted puede escribir su propio filtro de respuesta para cambiar el encabezado de tipo de contenido.

@Provider 
public class MimeAddingFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
     throws IOException { 
     responseContext.getHeaders().add("Content-Type", "image/png"); 
    } 

} 

Este filtro agregará el encabezado de tipo de contenido "image/png". También puede cambiar o eliminar encabezados en los filtros de respuesta JAX-RS.

Cuestiones relacionadas