我正在使用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 回答
阅读本页面的@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
个对象 .