JAX-RSで文字セットを設定するにはどうすればよいですか? @Produces("text/html; charset=UTF-8")
を試しましたが、それは無視され、text/html
はHTTPヘッダーとともに送信されました。 MessageBodyWriter内で文字セットを設定したいのですが、自分でリフレクションを介して@Producesアノテーションを分析してメディアタイプを抽出したくありません。
Daemonがコメントで指摘したように、JAX-RSの最新バージョン(2012年9月現在の安定バージョンを含む)は現在do@Produces
構文をサポートします。だからあなただけを使用することができます:
@Produces("text/html; charset=UTF-8")
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();
ただそれを最新に保つために。これが古いバージョンのJerseyでサポートされているかどうかはわかりませんが、ResponseBuilder.header(...)メソッドを使用することに決めた場合、MediaTypeメソッドwithCharset()を使用できます。このような:
return Response.status(Status.OK)
.entity(result)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
.build());
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仕様の改訂によりこれが容易になることを願っています。
最初に、リソースクラスメソッドに_@Produces
_注釈を設定します。
次に、返された型のMessageBodyWriter
で、writeTo()
メソッドでこれを行うことができます。
_response.setContentType(mediaType.toString);
_
備考:response
にwriter
を挿入するには、次のようにします。
_@Context
protected HttpServletResponse response;
_
私がやることは、サーブレット応答オブジェクトのインスタンスを取得することです:
protected @Context HttpServletResponse response;
そして、文字エンコードをutf-8に設定します。
response.setCharacterEncoding("utf-8");
それは私のために働く。
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で文字セットを設定します