Изменить то, что @Produces (…) производит в Джерси?

1

Я новичок в Джерси и хочу изменить то, что производит следующее:

@Produces(MediaType.APPLICATION_JSON)

То, что я в конечном счете пытаюсь сделать, это убедиться, что кодировка символа ответа установлена на UTF-8. Я могу сделать это в каждом конкретном случае, если я делаю это при каждом методе, который создает json.

@Produces("application/json;charset=UTF-8")

Я, конечно, хотел бы сделать это один раз в своем приложении, и он будет работать везде. Моя первая мысль заключалась в том, чтобы реализовать java-фильтр, чтобы изменить это, и я не смог заставить это работать.

EDIT: чтобы быть на 100% понятным - я хочу сделать это один раз в своем приложении, каким-то глобальным способом, и повлиять на все результаты, которые будут производиться Джерси, где бы я ни был @Produces(MediaType.APPLICATION_JSON) в моем код. Поэтому, если у меня было 100 методов, которые @Produces(MediaType.APPLICATION_JSON), тогда вдруг 100 методов отправили бы с кодировкой содержимого UTF-8.

Так или иначе, я могу просто заменить то, что @Produces(MediaType.APPLICATION_JSON)? Я бы просто изменил MediaType.APPLICATION_JSON на мое новое значение, если оно не было окончательным ;-)

  • 0
    Вы можете использовать Response для генерации ответа с любым типом контента (и кодировки), который вы хотите.
  • 0
    Если весь ваш JSON должен быть закодирован как UTF-8, вы, вероятно, должны использовать платформу, чтобы всегда делать это. В зависимости от того, как вы сериализуете в JSON, вам нужно настроить сериализацию так, чтобы это происходило. Это самый надежный способ.
Показать ещё 2 комментария
Теги:
jersey
content-type

2 ответа

1
Лучший ответ

Вы можете реализовать это как ContainerResponseFilter который переопределяет поведение @Produces @Produces в @Produces вас конкретном случае.

@Provider
@Priority(Priorities.HEADER_DECORATOR)
public class MediaTypeFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        for (Annotation annotation : responseContext.getEntityAnnotations()) {
            filterProducesAnnotation(annotation, responseContext);
        }
    }

    private void filterProducesAnnotation(Annotation annotation, ContainerResponseContext responseContext) {
        if (annotation instanceof Produces) {
            Produces produces = (Produces) annotation;
            filterMediaTypes(produces, responseContext);
        }
    }

    private void filterMediaTypes(Produces produces, ContainerResponseContext responseContext) {
        List<Object> mediaTypes = new ArrayList<Object>();
        for (String mediaType : produces.value()) {
            contentTypes.add(mediaType.equals(MediaType.APPLICATION_JSON) ? mediaType + ";charset=UTF-8" : mediaType);
        }
        responseContext.getHeaders().put("Content-Type", mediaTypes);
    }
}

Просто не забудьте зарегистрировать MediaTypeFilter с помощью приложения Jersey.

0

Я не думаю, что есть тип мультимедиа по умолчанию, который вам нужен.

Хотя альтернативой фильтру может быть введение константы, содержащей требуемую кодировку символов + mimetype+. Так что просто:

private static final String APPLICATION_JSON_UTF8 = MediaType.APPLICATION_JSON + ";charset=UTF-8";

Единственная причина этого в том, что "application/json; charset = UTF-8" не загрязняет ваш код как обычный текст (представьте рефакторинг, если вам нужно изменить кодировку символов с помощью "магической строки" везде :))

  • 0
    эй ... спасибо за предложение ... я пытаюсь 1) заставить весь существующий код работать как предложено, и 2) в будущем любой новый код, который может быть введен, который просто использует @Produces(MediaType.APPLICATION_JSON) аннотации, и не знает о новом способе сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню