Как установить кодировку с помощью JAX-RS? Я пробовал @Produces("text/html; charset=UTF-8")
, но это было проигнорировано, и только сообщение text/html
было отправлено с заголовком HTTP. Я хочу установить кодировку в MessageBodyWriter, но не хочу извлекать тип носителя, анализируя аннотацию @Produces посредством отражения от себя.
Как установить кодировку с помощью JAX-RS?
Ответ 1
Как отметил Демон в комментарии, последние версии JAX-RS (включая стабильную версию по состоянию на сентябрь 2012 года) теперь do поддерживают синтаксис @Produces
. Поэтому вы можете просто использовать:
@Produces("text/html; charset=UTF-8")
Ответ 2
Также можно использовать метод 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();
Ответ 3
Если вы хотите сделать это в нейтральном режиме реализации JAX-RS, вы можете reset Content-Type в MessageBodyWriter. Что-то вроде:
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().
Просто FYI, Apache Wink поддерживает использование кодировки и других атрибутов для типов медиа. Надеюсь, что будущие спецификации спецификации JAX-RS облегчат это.
Ответ 4
Просто, чтобы быть в курсе последних событий. Не уверен, поддерживалось ли это в более старых версиях Джерси, но определенно, если вы решите использовать метод ResponseBuilder.header(...), вы можете использовать метод MediaType withCharset(). Вот так:
return Response.status(Status.OK)
.entity(result)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
.build());
Ответ 5
Что я делаю, так это получить экземпляр объекта ответа сервлета:
protected @Context HttpServletResponse response;
И затем установите кодировку символов в utf-8:
response.setCharacterEncoding("utf-8");
Это работает для меня.
Ответ 6
Первая настройка @Produces
аннотации к вашим методам класса ресурсов.
Затем в MessageBodyWriter
вашего возвращаемого типа вы можете сделать это в методе writeTo()
:
response.setContentType(mediaType.toString);
Примечание. Вы можете ввести response
в свой writer
с помощью:
@Context
protected HttpServletResponse response;
Ответ 7
Если вы используете 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