Как установить кодировку с JAX-RS? - PullRequest
50 голосов
/ 08 августа 2010

Как я могу установить кодировку с JAX-RS? Я попытался @Produces("text/html; charset=UTF-8"), но это было проигнорировано, и только text/html было отправлено с заголовком HTTP. Я хочу установить кодировку в MessageBodyWriter, но не хочу извлекать тип мультимедиа, анализируя аннотацию @Produces через отражение самостоятельно.

Ответы [ 7 ]

66 голосов
/ 27 сентября 2012

Как отметил Daemon в комментарии, последние версии JAX-RS (включая стабильную версию по состоянию на сентябрь 2012 года) теперь do поддерживают синтаксис @Produces.Так что вы можете просто использовать:

@Produces("text/html; charset=UTF-8")
15 голосов
/ 31 августа 2011

Также можно использовать метод 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();
11 голосов
/ 31 июля 2015

Просто чтобы держать это в курсе.Не уверен, поддерживается ли это в более старых версиях Джерси, но определенно, если вы решите использовать метод ResponseBuilder.header (...), вы можете использовать метод MediaType withCharset () .Как это:

return Response.status(Status.OK)
         .entity(result)
         .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
         .build());
10 голосов
/ 10 августа 2010

Если вы хотите сделать это нейтральным способом реализации JAX-RS, вы можете сбросить 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 для каждого метода ресурса, вы можете создать собственную аннотацию и добавить ее к каждому методу ресурса.Затем попробуйте использовать параметр annotations в методе writeTo ().

Just FYI, Apache Wink поддерживает использование charset и других атрибутов для типов носителей.Я надеюсь, что будущие изменения спецификации JAX-RS облегчат это.

1 голос
/ 07 декабря 2016

Если вы используете 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 голос
/ 24 августа 2016

Что я делаю, так это получаю экземпляр объекта ответа сервлета:

protected @Context HttpServletResponse response;

А затем установите кодировку символов в utf-8:

response.setCharacterEncoding("utf-8");

Это работает для меня.

1 голос
/ 23 августа 2016

Первая настройка @Produces аннотация к вашим методам класса ресурсов.

Затем в MessageBodyWriter вашего возвращаемого типа вы можете сделать это в writeTo() методе:

response.setContentType(mediaType.toString);

Примечание: Вы можете ввести response в свой writer с помощью:

@Context
protected HttpServletResponse response;
...