Как добавить `charset = utf-8` к ответам, соответствующим заданным критериям типа контента в Spring MVC?

#java #spring

#java #весна #spring

Вопрос:

У меня есть requiremet для добавления charset=utf-8 ко «всем ответам», кроме ответов данного типа контента. Так, например, ответ, имеющий кодировку application/json or application/xml , должен иметь добавленную кодировку, но application/pdf or application/zip и eg octet-stream не должны. Я пытался использовать filter для этого, однако ответ content-type еще не установлен, поэтому я не могу его проанализировать.

Это не работает, так как тип контента всегда null

 @Bean
public CharacterEncodingFilter characterEncodingFilter() {
    CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter() {
        @Override
        protected void doFilterInternal(
                HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {
            String contentType = response.getContentType();
            if (StringUtils.isNotBlank(contentType)) {
                //add other conditions if needed
                if (!contentType.contains(MediaType.APPLICATION_PDF_VALUE) amp;amp; !contentType.contains("stream")) {
                    response.setCharacterEncoding(StandardCharsets.UTF_8.name());
                }
            }
            filterChain.doFilter(request, response);
        }

    };
    return filter;
}
  

ПС

обычно я бы просто добавлял свойства

 spring.http.encoding.charset=UTF-8
spring.http.encoding.force-response=true
  

но это будет добавляться к каждому ответу, и указание кодировки не имеет смысла для потоков, PDF-файлов и zip-архивов — таким образом, требование соответствия критериям.

Должен ли я обернуть ответ в прокси-объект, как в фильтрах сервлетов?

Комментарии:

1. Это может сделать перехватчик MVC, но может быть и более чистый способ.