Envoltura de excepción JAX-RS CXF

Me gustaría agregar un ExceptionMapper a CXF (2.6.1) que no solo comunica el código de respuesta, sino que también envía la excepción en el formato de carga útil (estoy usando JSON por ahora).

@Provider
public class CustomExceptionMapper
        implements
            ExceptionMapper<MyException>
{
...
@Override
public Response toResponse(MyException mex)
{
//I need something here which can convert mex object to JSON and ship it in response
// I want this to be de-serialized on client

//the following returns the status code
return Response.status(Response.Status.BAD_REQUEST).build();
}
...
}

Hay alguna forma de hacer esto ?

preguntado el 27 de julio de 12 a las 17:07

1 Respuestas

Es posible que deba usar @Produces para serializar su objeto en JSON como:

@Produces(MediaType.APPLICATION_JSON)

Y entonces return Response.ok().entity(OBJECT).build();

La forma en que puede probar su servicio:

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
ClientResponse response = service.path(ADDRESS).type("application/json").get(ClientResponse.class);
String s = response.getEntity(String.class);
System.out.println(s); 

private static URI getBaseURI() {
        return UriBuilder.fromUri(SERVER ADDRESS).build();
}

Respondido 27 Jul 12, 18:07

Gracias por la respuesta. Pero me gustaría devolver el estado 500 o 400 pero no el 200. ¿Hay alguna manera de eso? - Chris

Lo averigué. Es así Response.ok(mex,MediaType.APPLICATION_JSON).status(Response.Status.BAD_REQUEST).build(); - Chris

En el lado del cliente, ¿tengo que agregar un interceptor? Parece que una respuesta que no es 200 se está bloqueando en mi servlet: Chris

No, no se debe bloquear. ¿Está utilizando Tomcat como su servlet? - Ali

Sí, es gato. y sí... Obtengo una excepción del tipo org.apache.cxf.jaxrs.client.ServerWebApplicationException ¿Cómo obtengo "MyException"? - Chris

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.