Il mio obiettivo è avere un bean di errore restituito su un 404 con un messaggio descrittivo quando un oggetto non viene trovato e restituire lo stesso tipo MIME richiesto.Restituzione di JSON o XML per le eccezioni nel Jersey
Ho una risorsa di ricerca, che restituirà l'oggetto specificato in XML o JSON basato sull'URI (Ho impostato il parametro servlet com.sun.jersey.config.property.resourceConfigClass in modo da non avere bisogno dell'intestazione Accept . Il mio JAXBContextResolver ha ErrorBean.class nel suo elenco di tipi e il JAXBContext corretto viene restituito per questa classe perché posso vedere nei log).
esempio: 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");
}
}
E il mio NotFoundException assomiglia a questo:
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());
}
}
L'ErrorBean è la seguente:
@XmlRootElement(name = "error")
public class ErrorBean {
private String errorMsg;
private int errorCode;
//no-arg constructor, property constructor, getter and setters
...
}
Tuttavia, sono sempre di ottenere un 204 Nessuna risposta quando provo Questo. Ho violato in giro, e se torno una stringa e specificare il tipo MIME Questo funziona bene:
public NotFoundException(String message) {
super(Response.status(Response.Status.NOT_FOUND).
entity(message).type("text/plain").build());
}
Ho anche cercato di restituire un ErrorBean come una risorsa. Questo funziona bene:
{"errorCode":404,"errorMsg":"Location 1 is not found!"}