Возвращение JSON или XML для исключений в Джерси - PullRequest
11 голосов
/ 20 мая 2010

Моя цель - вернуть компонент ошибки на 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!"}

1 Ответ

9 голосов
/ 21 мая 2010

Для тех, у кого похожие проблемы в будущем ...

Оказывается, мой код был в порядке. Я вырывал свои волосы, поэтому я переписал этот модуль, и все еще нигде не получал. Мой браузер просто сидел бы там и зависал навсегда. Я начал проверять заголовки с помощью LiveHTTPHeaders (надстройка Firefox) и заметил, когда это произошло, Content-Length был больше нуля. Затем я проверил с hurl.it и обнаружил, что тело возвращалось нормально. Браузер будет нормально обрабатывать XML-ответ, но никогда не будет отображать JSON (таким образом зависание). Это хорошо для моей цели, так как это чисто API для потребления приложений, а не для пользователей. Информацию об исключениях при отображении можно найти в Jersey wiki .

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)"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...