Resteasy Content-Type默认值

时间:2011-07-07 17:09:37

标签: java http-headers resteasy

我正在使用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)

如何设置第二个Content-Type停止重复,或者有更好的方法来执行此操作而不必在同一个@Path上使用两个单独的函数但使用不同的@Produces注释?

另一个选择是不打扰response.setContentType并拥有@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})并让Resteasy处理它,但是如何检测将返回的匹配的mediatype?我可以获取HttpHeaders对象并在其上调用getAcceptableMediaTypes(),但这意味着我必须有效地重新解释resteasy已经为我做过的Accept Header。当你提供多个@Produces参数时,肯定有一种方法可以从返回中获取返回的MediaType吗?

1 个答案:

答案 0 :(得分:3)

阅读本页http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features的@Produces部分,看来规范要求应用选择与HTTP Accept标头匹配的内容类型。如果@Produces注释中的所有内容类型都匹配,那么它应该只使用第一个。

所以我在考虑两件事之一。 Resteasy可能无法正确实施规范。 @Produces注释和.setContentType调用也可能不是很好。我不是JAX-RS的主人,但我认为Produces注释就在那里,所以你不必直接与Response个对象进行交互。