Я новичок в Джерси и хочу изменить то, что производит следующее:
@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 на мое новое значение, если оно не было окончательным ;-)
Вы можете реализовать это как 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.
Я не думаю, что есть тип мультимедиа по умолчанию, который вам нужен.
Хотя альтернативой фильтру может быть введение константы, содержащей требуемую кодировку символов + mimetype+. Так что просто:
private static final String APPLICATION_JSON_UTF8 = MediaType.APPLICATION_JSON + ";charset=UTF-8";
Единственная причина этого в том, что "application/json; charset = UTF-8" не загрязняет ваш код как обычный текст (представьте рефакторинг, если вам нужно изменить кодировку символов с помощью "магической строки" везде :))
@Produces(MediaType.APPLICATION_JSON)
аннотации, и не знает о новом способе сделать это.
Response
для генерации ответа с любым типом контента (и кодировки), который вы хотите.