如何使用JAX-RS设置charset?

dea*_*mon 51 java jax-rs character-encoding java-ee

如何使用JAX-RS设置charset?我已经尝试@Produces("text/html; charset=UTF-8")但是被忽略了,只有text/htmlHTTP头发送.我想在MessageBodyWriter中设置charset,但不希望通过我自己的反射分析@Produces注释来提取媒体类型.

Adr*_*scu 68

作为守护进程在评论中指出,JAX-RS的最新版本(包括稳定版为2012年9月),现在支持的@Produces语法.所以你可以使用:

@Produces("text/html; charset=UTF-8")
Run Code Online (Sandbox Code Playgroud)

  • @Drewch JAX-RS 1.1是否支持此功能?JAX-RS问世的时候似乎无法找到.我试过`@Produces(MediaType.APPLICATION_JSON +"; charset = UTF-16")`,但那不起作用. (4认同)
  • @Produces("text/html; charset = UTF-8")在Jersey 2.13中对我不起作用.有@deamon描述的相同问题. (3认同)

小智 15

也可以使用ResponseBuilder.header(...)方法使用charset设置内容类型.请参阅下面的代码示例(使用JAX-RS 1.1.1,CXF 2.3.1).

final Response myResponse = Response.status(Response.Status.BAD_REQUEST)
    .entity("La requête n'est pas correcte.\n ...")
    .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN+"; charset=ISO-8859-15" )
    .build();
Run Code Online (Sandbox Code Playgroud)

  • 你不需要通过头设置它,还有`type()`方法:`Response.status(Response.Status.BAR_REQUEST).entity("Larequêten'estpas correcte.\n ..."). type(MediaType.TEXT_PLAIN +"; charset = ISO-8859-15").build();` (4认同)

stv*_*per 14

只是为了让它保持最新.不确定这是否在旧版本的Jersey中受支持,但是如果您决定使用ResponseBuilder.header(...)方法,则可以使用MediaType方法withCharset().像这样:

return Response.status(Status.OK)
         .entity(result)
         .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
         .build());
Run Code Online (Sandbox Code Playgroud)

  • 更短(并且具有更好的类型安全性):使用`javax.ws.rs.core.Response.ResponseBuilder.type(MediaType)`而不是`javax.ws.rs.core.Response.ResponseBuilder.header(HttpHeaders.CONTENT_TYPE,对象)` (3认同)

Bry*_*Luk 10

如果要以JAX-RS实现中立方式执行此操作,则可以在MessageBodyWriter中重置Content-Type.就像是:

public void writeTo(Object obj,
                    Class<?> cls,
                    Type type,
                    Annotation[] annotations,
                    MediaType mt,
                    MultivaluedMap<String, Object> responseHttpHeaders,
                    OutputStream stream) throws IOException {
    responseHttpHeaders.putSingle(javax.ws.rs.core.HttpHeaders.CONTENT_TYPE, mt.toString() + ";charset=UTF-8");
}
Run Code Online (Sandbox Code Playgroud)

如果除了每个资源方法的UTF-8之外还有不同的字符集,则可能需要创建自定义注释并将其添加到每个资源方法.然后,尝试在writeTo()方法中使用annotations参数.

仅供参考,Apache Wink支持在媒体类型上使用字符集和其他属性.我希望未来的JAX-RS规范版本能够让这更容易.