Utf 8 JAX-RS/Jersey在生成JSON时以奇怪的方式处理HTTP头

Utf 8 JAX-RS/Jersey在生成JSON时以奇怪的方式处理HTTP头,utf-8,jax-rs,jersey-2.0,glassfish-4,Utf 8,Jax Rs,Jersey 2.0,Glassfish 4,我们在GlassFish 4.1上使用Jersey 2.19时发生了一件奇怪的事情 我们目前正在将旧的基于servlet的json服务迁移到JAX-RS。使用旧的servlet,我们在编码方面没有任何问题(使用JAXB/MOXy进行编组/解编组) 现在,给定一个特定的服务: @GET @Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8") public Help getHelp( @PathParam("pageId") String

我们在GlassFish 4.1上使用Jersey 2.19时发生了一件奇怪的事情

我们目前正在将旧的基于servlet的json服务迁移到JAX-RS。使用旧的servlet,我们在编码方面没有任何问题(使用JAXB/MOXy进行编组/解编组)

现在,给定一个特定的服务:

@GET
@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
public Help getHelp( @PathParam("pageId") String pageId, @PathParam("language") String language, 
        @Context HttpServletRequest request, 
        @HeaderParam("accept-language") String userLanguage ) {
客户端收到HTTP响应,但缺少一些标头:

Response:
HTTP/1.1 200 OK
Server: GlassFish Server Open Source Edition  4.1
x-powered-by: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition  4.1  Java/Oracle Corporation/1.7)
Content-Type: application/json
Date: Tue, 13 Oct 2015 11:28:06 GMT
Content-Length: 3453
对于以下请求:

Request headers:
GET ... HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: hu-HU,en-US;q=0.8,hu;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: ...
Cookie: JSESSIONID=0ef43870235def33391f93b81818; __utma=111872281.648188082.1392392895.1392392895.1392392895.1; ice.push.browser=1ifp52zip; ice.connection.lease=1444735687588; ice.connection.contextpath=.; ice.connection.running=9621a:acquired
Connection: keep-alive
因此,尽管请求了UTF-8,但mozilla将我们得到的响应解释为不是UTF-8,因此我们无法正确地看到特殊语言字符(如“á”、“é”、“ő”等)

奇怪的是,当我们使用responsebuilder直接构建响应时:

final Response myResponse = Response.status(Response.Status.OK)
            .entity(entity)
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
            .build();
我们得到以下响应标题:

HTTP/1.1 200 OK
Server: GlassFish Server Open Source Edition  4.1
x-powered-by: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition  4.1  Java/Oracle Corporation/1.7)
Content-Type: application/json; charset=utf-8
Date: Tue, 13 Oct 2015 11:33:57 GMT
Content-Length: 103
因此,当直接指示时,Jersey似乎只将UTF-8字符集放在响应头中

您知道其他选项吗,如何直接在Jersey响应中告诉您如何使用charset=utf-8发送数据?而不使用responsebuilder


谢谢

“因此,尽管事实如此,UTF-8还是被请求了”-Um否。只有
内容类型
指定了字符集。这是客户端发送的数据类型。
Accept
头告诉服务器您想要返回的类型。因此,在
Accept
中设置字符集。从我测试的内容来看,它应该可以工作。很好的捕获,我将测试它。“因此,尽管事实如此,UTF-8是被请求的”-嗯,没有。只有
内容类型
指定了字符集。这是客户端发送的数据类型。
Accept
头告诉服务器您想要返回的类型。因此,在
Accept
中设置字符集。从我测试的结果来看,它应该是有效的。接得好,我会测试它的。