Resteasy Content-Type по умолчанию - PullRequest
3 голосов
/ 07 июля 2011

Я пишу приложение с использованием Resteasy, которое может возвращать как JSON, так и XML, но по выбору по умолчанию будет XML. Вот мой метод:

@GET
@Path("/content")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public String contentListRequestXml(@Context HttpServletRequest req, 
    @Context HttpServletResponse response, @Context UriInfo info, @Context HttpHeaders h) {
    response.setContentType(MediaType.APPLICATION_XML);
    if(isXml)        
        return generateXML();
    else
        return generateJSON();
}

У меня проблема в том, что он возвращает два типа контента:

$ curl http://localhost:1234/content -i -H "Accept: application/json,application/xml" -I HTTP/1.1 200 OK
Content-Type: application/xml
Content-Type: application/json
Content-Length: 0
Server: Jetty(6.1.25)

Как мне остановить resteasy от установки второго Content-Type, или есть лучший способ сделать это без необходимости иметь две отдельные функции на одном @Path, но с разными аннотациями @Produces?

Другой вариант - не беспокоиться о response.setContentType и иметь @Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) и позволить Resteasy справиться с этим, но как мне определить соответствующий медиатип, который будет возвращен? Я могу получить объект HttpHeaders и вызвать для него функцию getAcceptableMediaTypes (), но это означает, что я должен эффективно переосмыслить заголовок Accept, который рестетинг уже сделал для меня. Конечно, должен быть способ получить возвращенный MediaType из resteasy, когда вы указываете несколько параметров @Produces?

1 Ответ

3 голосов
/ 07 июля 2011

Чтение раздела @Produces на этой странице http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features, кажется, что спецификация хочет, чтобы приложение выбирало тот тип контента, который соответствует заголовку HTTP Accept. И если все типы контента в аннотации @Produces совпадают, он должен просто использовать первый.

Так что я думаю об одном из двух. Возможно, что Resteasy неправильно реализует спецификацию. Также возможно, что аннотация @Produces и вызов .setContentType не очень хороши. Я не мастер JAX-RS, но я подумал, что аннотация Produces была там, чтобы вам не приходилось напрямую взаимодействовать с Response объектами.

...