54

JAX-RSで文字セットを設定するにはどうすればよいですか?私は試しまし@Produces("text/html; charset=UTF-8")たが、それは無視されtext/html、HTTPヘッダーでのみ送信されました。MessageBodyWriter内に文字セットを設定したいのですが、自分でリフレクションを介して@Producesアノテーションを分析してメディアタイプを抽出したくありません。

4

7 に答える 7

72

Daemonがコメントで指摘したように、JAX-RSの最新バージョン(2012年9月現在の安定バージョンを含む)は現在、構文をサポートしています。@Producesしたがって、次を使用できます。

@Produces("text/html; charset=UTF-8")
于 2012-09-26T23:54:31.147 に答える
17

最新の状態に保つためだけに。これが古いバージョンのJerseyでサポートされているかどうかはわかりませんが、ResponseBuilder.header(...)メソッドを使用する場合は、MediaTypeメソッドwithCharset()を使用できます。このような:

return Response.status(Status.OK)
         .entity(result)
         .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
         .build());
于 2015-07-31T08:39:18.463 に答える
15

ResponseBuilder.header(...)メソッドを使用して、文字セットでコンテンツタイプを設定することもできます。コードサンプルについては、以下を参照してください(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();
于 2011-08-30T21:13:35.827 に答える
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");
}

リソースメソッドごとにUTF-8以外に異なる文字セットがある場合は、カスタムアノテーションを作成し、それを各リソースメソッドに追加することをお勧めします。次に、writeTo()メソッドでannotationsパラメーターを使用してみます。

参考までに、Apache Winkは、メディアタイプでの文字セットおよびその他の属性の使用をサポートしています。将来のJAX-RS仕様の改訂により、これが容易になることを願っています。

于 2010-08-09T22:01:16.923 に答える
1

リソースクラスメソッドの最初のセットアップ@Producesアノテーション。

次に、返されたタイプで、メソッドMessageBodyWriterでこれを行うことができます。writeTo()

response.setContentType(mediaType.toString);

備考:あなたはあなたの中に注入することができresponseますwriter

@Context
protected HttpServletResponse response;
于 2016-08-23T09:40:37.247 に答える
1

私がしていることは、サーブレット応答オブジェクトのインスタンスを取得することです。

protected @Context HttpServletResponse response;

次に、文字エンコードをutf-8に設定します。

response.setCharacterEncoding("utf-8");

それは私にとってはうまくいきます。

于 2016-08-24T13:01:01.327 に答える
1

RESTEasyを使用している場合は、Inteceptorを登録できます。

import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.core.ResourceMethodInvoker;
import org.jboss.resteasy.core.ServerResponse;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.interception.PreProcessInterceptor;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;

@Provider
@ServerInterceptor
public class ContentTypeSetter implements PreProcessInterceptor {
    @Override
    public ServerResponse preProcess(HttpRequest request, ResourceMethodInvoker resourceMethodInvoker) throws Failure, WebApplicationException {
        request.setAttribute(InputPart.DEFAULT_CONTENT_TYPE_PROPERTY, "*/*; charset=UTF-8");
        return null;
    }
}

注:@Producesを手動で設定すると、このインターセプターによって設定されたContentTypeがオーバーライドされます。その場合は、@Producesで文字セットを設定してください

于 2016-12-07T16:41:02.257 に答える