Моей цели состоял в том, чтобы возвратить ошибочный боб на 404 с описательным сообщением, когда объект не найден, и возвратите тот же тип MIME, который требовали.
Я взглянул ресурс, который возвратит указанный объект в XML или JSON на основе URI (я имею, устанавливают com.sun.jersey.config.property.resourceConfigClass параметр сервлета, таким образом, мне не нужен Принять заголовок. Мой 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 ответа Содержания, когда я пробую это. Я бездельничал, и если я возвращаю строку и указываю, что пантомима вводит, это хорошо работает:
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!"}
Для тех, у кого в будущем возникнут похожие проблемы ...
Оказывается, мой код в конце концов был в порядке. Я выдергивал волосы, поэтому переписал этот модуль, и все равно ничего не добился. Мой браузер просто сидел и зависал вечно. Я начал проверять заголовки с помощью LiveHTTPHeaders (надстройка Firefox) и заметил, когда это произошло, Content-Length была больше нуля. Затем я протестировал с помощью hurl.it и обнаружил, что тело возвращается нормально. Браузер будет нормально обрабатывать ответ XML, но никогда не отобразит JSON (таким образом, зависание). Это хорошо для моей цели, поскольку это чисто API для потребления приложений, а не для пользователей. На вики Джерси есть информация об исключениях при отображении.
HTTP/1.1 404 Not Found
Content-Type: application/json
Date: Fri, 21 May 2010 06:39:28 GMT
Server: Google Frontend
Cache-Control: private, x-gzip-ok=""
Transfer-Encoding: chunked
{
"errorCode": "404",
"errorMsg": "Could not retrieve entity of kind Location with key Location(10)"
}