Проблема с кодировкой UTF-8 с Thymeleaf Spring MVC

У меня проблема с символами UTF-8. Я пробовал много решений, но ничего не работает для меня. Что у меня есть прямо сейчас:

  • Tomcat (сервер.xml):

    <Connector URIEncoding = "UTF-8" useBodyEncodingForURI = "true" connectionTimeout = "20000" port = "8080" protocol = "HTTP/1.1" redirectPort = "8443"/>
    
  • Базовый класс конфигурации:

    public class HomeInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { WebSecurityConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebMvcConfiguration.class };
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8"); // forcing UTF-8
        filter.setForceEncoding(true);
        return new Filter[] { filter };
    }
    }
    
  • Класс WebMvcConfiguration, который содержит конфигурацию Thymeleaf:

    @Bean
    public ThymeleafViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("UTF-8"); // forcing UTF-8
        viewResolver.setContentType("text/html; charset=UTF-8");
        viewResolver.setOrder(1);
        viewResolver.setViewNames(new String[] { ".html", ".xhtml" });
        return viewResolver;
    }
    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setCharacterEncoding("UTF-8"); // forcing UTF-8
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCacheable(true);
        return templateResolver;
    }
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        registry.viewResolver(resolver);
    }
    
  • WebSecurityConfig, который содержит остальную часть конфигурации:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().anonymous().antMatchers("/login**", "/*.js", "/*.css", "/*.svg").permitAll().anyRequest().authenticated()
                        .antMatchers("/login**").permitAll().and().formLogin().loginPage("/login").loginProcessingUrl("/login").usernameParameter("username")
                        .passwordParameter("password").defaultSuccessUrl("/", true).permitAll().and().logout()
                        .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login?logout").deleteCookies("JSESSIONID")
                        .invalidateHttpSession(true).permitAll();
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8"); // another forcing UTF-8
        filter.setForceEncoding(true);
        http.addFilterBefore(filter, CsrfFilter.class);
    }
    
  • все html-страницы содержат:

    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
    
  • до того, как я добавил Thymeleaf и использовал jsp, я мог отображать специальные символы

  • также проверил, что все файлы (.html) имеют кодировку UTF-8
  • Настройки Eclipse изменены, чтобы все оставалось в UTF-8.
  • проверил, вероятно, все ответы на stackoverflow, связанные с этой проблемой, и проверил все ответы с более высоким рейтингом (включая это, это и это)
  • проверенное решение для обмена сообщениями Thymeleaf (какой-то вопрос стека для этого)
  • экранированные символы \u0119 отображаются как есть - \u0119
  • создал новый проект с той же pom.xml, конфигурацией Spring/Thymeleaf

И еще вместо полировки ąęłźżńłó у меня есть ???????ó отображается на странице. Есть идеи?

К сожалению у меня нет web.xml и вся конфигурация использует аннотации. я не могу контролировать Filter порядок занятий — см. можно использовать аннотацию @Order

Используемые технологии: Spring Framework 5.1.6, Spring Security 5.1.5, Thymeleaf 3.0.11, Thymeleaf Spring security4 3.0.4, Maven 4, Tomcat 9.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 908
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Так что это может показаться очень полезным, но вы перешли к структуре каталогов, щелкнули правой кнопкой мыши папку, содержащую ваши страницы, и выбрали «Обновить»?

Я не знаю, какую IDE вы используете, но в прошлом мне приходилось вручную заходить в Eclipse и обновлять пакет, содержащий статическое содержимое.

Если вы этого не сделаете, изменения не будут учтены.

Я использую версию Eclipse: 2019-03 (4.11.0), и обновление тоже не помогает.

Tomasz Dzięcielewski 17.05.2019 08:23
Ответ принят как подходящий

К сожалению, я должен ответить на свой вопрос.

Чтобы прочитать данные UTF-8 из файла свойств, просто используйте свойство кодирования

@Component
@PropertySource(value = "classpath:config/data.properties", encoding = "UTF-8")

в основном помогло добавление некоторых дополнительных вызовов метода к методу configureViewResolvers:

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8"); // <- this was added
        resolver.setForceContentType(true); // <- this was added
        resolver.setContentType("text/html; charset=UTF-8"); // <- this was added
        registry.viewResolver(resolver);
    }

и, кроме того, в методе configure(HttpSecurity http) я изменил способ добавления фильтра к этому:

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);

        http.authorizeRequests().anyRequest().anonymous()
        .antMatchers("/login**", "/*.js", "/*.css", "/*.svg" ).permitAll()
        // ... some other config
        .invalidateHttpSession(true)
        .permitAll()
        .and()
        .addFilterBefore(filter, CsrfFilter.class); // <- this was added
    }

Другие вопросы по теме