Mi objetivo es tener un error bean devuelto en un 404 con un mensaje descriptivo cuando no se encuentra un objeto, y devolver el mismo tipo MIME que se solicitó.Devolver JSON o XML para excepciones en Jersey
Tengo un recurso de búsqueda, que devolverá el objeto especificado en XML o JSON basado en el URI (configuré el parámetro del servlet com.sun.jersey.config.property.resourceConfigClass, así que no necesito el encabezado Accept . Mi JAXBContextResolver tiene el ErrorBean.class en su lista de tipos, y el JAXBContext correcto se devuelve para esta clase porque puedo ver en los registros).
por ejemplo: http://foobar.com/rest/locations/1.json
@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Location getCustomer(@PathParam("id") int cId) {
//look up location from datastore
....
if (location == null) {
throw new NotFoundException("Location" + cId + " is not found");
}
}
Y mi NotFoundException se ve así:
public class NotFoundException extends WebApplicationException {
public NotFoundException(String message) {
super(Response.status(Response.Status.NOT_FOUND).
entity(new
ErrorBean(
message,
Response.Status.NOT_FOUND.getStatusCode()
)
.build());
}
}
El ErrorBean es el siguiente:
@XmlRootElement(name = "error")
public class ErrorBean {
private String errorMsg;
private int errorCode;
//no-arg constructor, property constructor, getter and setters
...
}
Sin embargo, siempre estoy recibiendo un 204 Sin contenido respuesta cuando intento esta. He cortado alrededor, y si vuelvo una cadena y especifique el tipo MIME Esto funciona bien:
public NotFoundException(String message) {
super(Response.status(Response.Status.NOT_FOUND).
entity(message).type("text/plain").build());
}
también he intentado devolver un ErrorBean como un recurso. Esto funciona bien:
{"errorCode":404,"errorMsg":"Location 1 is not found!"}