Моя цель - вернуть компонент ошибки на 404 с описательным сообщением, когда объект не найден, и вернуть тот же MIME-тип, который был запрошен.
У меня есть ресурс поиска, который будет возвращать указанный объект в XML или JSON на основе URI (я настроил параметр сервлета com.sun.jersey.config.property.resourceConfigClass, поэтому мне не нужен заголовок Accept. Мой JAXBContextResolver имеет ErrorBean.class в своем списке типов, и правильный JAXBContext возвращается для этого класса, потому что я вижу в журналах).
Например: 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");
}
}
И мое NotFoundException выглядит так:
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());
}
}
ErrorBean выглядит следующим образом:
@XmlRootElement(name = "error")
public class ErrorBean {
private String errorMsg;
private int errorCode;
//no-arg constructor, property constructor, getter and setters
...
}
Однако я всегда получаю ответ 204 No Content , когда пытаюсь это сделать. Я взломал, и если я возвращаю строку и указываю тип MIME, это прекрасно работает:
public NotFoundException(String message) {
super(Response.status(Response.Status.NOT_FOUND).
entity(message).type("text/plain").build());
}
Я также попытался вернуть ErrorBean в качестве ресурса. Это отлично работает:
{"errorCode":404,"errorMsg":"Location 1 is not found!"}