web-dev-qa-db-ja.com

JAX-RSで文字セットを設定する方法は?

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

50
deamon

Daemonがコメントで指摘したように、JAX-RSの最新バージョン(2012年9月現在の安定バージョンを含む)は現在do@Produces構文をサポートします。だからあなただけを使用することができます:

@Produces("text/html; charset=UTF-8")
67
Adrian Petrescu

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();
15
SMougenot

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

return Response.status(Status.OK)
         .entity(result)
         .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
         .build());
14
stviper

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()メソッドで注釈パラメーターを使用してみます。

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

10
Bryant Luk

最初に、リソースクラスメソッドに_@Produces_注釈を設定します。

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

_response.setContentType(mediaType.toString);
_

備考:responsewriterを挿入するには、次のようにします。

_@Context
protected HttpServletResponse response;
_
1
To Kra

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

protected @Context HttpServletResponse response;

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

response.setCharacterEncoding("utf-8");

それは私のために働く。

1
Giannis

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で文字セットを設定します

1
lujop