Возврат JSON или XML для исключений на Джерси

Моей цели состоял в том, чтобы возвратить ошибочный боб на 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!"}

11
задан Dominic 20 May 2010 в 08:08
поделиться

1 ответ

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

Оказывается, мой код в конце концов был в порядке. Я выдергивал волосы, поэтому переписал этот модуль, и все равно ничего не добился. Мой браузер просто сидел и зависал вечно. Я начал проверять заголовки с помощью 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)"
}
9
ответ дан 3 December 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: