我正在使用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吗?
答案 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
个对象进行交互。