Как установить кодировку с помощью JAX-RS? - программирование
Подтвердить что ты не робот

Как установить кодировку с помощью JAX-RS?

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

4b9b3361

Ответ 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