首页 文章

Resteasy Content-Type默认值

提问于
浏览
3

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

  • 3

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

    所以我认为Resteasy没有 @Produces 也可能 @Produces 注释和 .setContentType 调用不是JAX-RS大师,但我认为Produces注释是存在的,所以你不必直接与之交互 Response 个对象 .

相关问题