关于 java:Resteasy Content-Type 默认值 | 珊瑚贝

Resteasy Content-Type defaults


我正在使用 Resteasy 编写一个可以返回 JSON 和 XML 的应用程序,但可以选择默认为 XML。这是我的方法:

1
2
3
4
5
6
7
8
9
10
11
@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();
}

我遇到的问题是它返回了两个 Content-Type:

1
2
3
4
5
$ curl http://localhost:1234/content -i -H”Accept: application/json,application/xml” -I HTTP/1.1 200 OK
ContentType: application/xml
ContentType: application/json
ContentLength: 0
Server: Jetty(6.1.25)

如何阻止 resteasy 设置第二个 Content-Type,或者有更好的方法来做到这一点,而不必在同一 @Path 上使用两个单独的函数但使用不同的 @Produces 注释?

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

  • 我可以做的另一件事是不要打扰响应对象,而只需使用 @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_J??SON})


阅读此页面 http://wikis.sun.com/display/Jersey/JAX-RS 1.0 功能概述的 @Produces 部分,规范似乎希望应用程序选择与 HTTP 接受匹配的任何内容类型标题。如果 @Produces 注释中的所有内容类型都匹配,它应该只使用第一个。

所以我在想两件事之一。 Resteasy 可能没有正确实施规范。 @Produces 注释和 .setContentType 调用也有可能表现不佳。我不是 JAX-RS 大师,但我认为 Produces 注释在那里,因此您不必直接与 Response 对象交互。

  • 哦,我还应该提到,如果我完全摆脱 @Produces 行,我会得到相同的结果。 :-(
  • 所以……如果你的函数返回一个字符串,你对 Response 对象做了什么?如果您只是返回响应对象包含的字符串,并且您没有在任何地方指定 contenttype,resteasy 可能只是复制 http 接受中的任何内容。我会尝试返回一个字符串并使用@Produces 行或不使用@Produces 行并返回一个响应。


来源:https://www.codenong.com/6614400/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?