14

When using Spring with Thymeleaf all my Cyrillic characters are shown as ????? on pages.

Using

@RequestMapping(value = "/login", method = RequestMethod.GET, produces = "text/html; charset=utf-8")

as it was suggested here: https://stackoverflow.com/a/11866822/1479414 and here: https://stackoverflow.com/a/12023816/1479414 doesn't help.

How to solve this issue?

Andremoniy
  • 34,031
  • 20
  • 135
  • 241

7 Answers7

25

The answer can be found here:

Property characterEncoding should be explicitly set for templateResolver and ThymeleafViewResolver:

<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    ...
    <property name="characterEncoding" value="UTF-8"/>
    ...
</bean>

<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    ...
    <property name="characterEncoding" value="UTF-8"/>
    ...
</bean>
Andremoniy
  • 34,031
  • 20
  • 135
  • 241
  • I've changed both settings but the unicode characters still do not render properly. Is there any other setting that could be misconfigured? – Addie Apr 06 '18 at 05:40
  • I don't know. I have not been working with Tapestry for two years. It might be that something has changed since that time – Andremoniy Apr 06 '18 at 08:23
5

working for me. java config

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.projectName.controller")
public class MVCConfig implements WebMvcConfigurer, ApplicationContextAware {

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws 
         BeansException {
        this.applicationContext = applicationContext;
    }

    @Bean
    public ViewResolver viewResolver(){
        ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
        thymeleafViewResolver.setTemplateEngine(templateEngine());
        thymeleafViewResolver.setCharacterEncoding("UTF-8");
       return thymeleafViewResolver;
    }

    @Bean
    public TemplateEngine templateEngine(){
       SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine();
       springTemplateEngine.setEnableSpringELCompiler(true);
       springTemplateEngine.setTemplateResolver(templateResolver());
       return springTemplateEngine;
   }

   @Bean
   public ITemplateResolver templateResolver(){
       SpringResourceTemplateResolver springResourceTemplateResolver = new 
                        SpringResourceTemplateResolver();
       springResourceTemplateResolver.setApplicationContext(applicationContext);
       springResourceTemplateResolver.setPrefix("/WEB-INF/views/");
       springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML);
       springResourceTemplateResolver.setSuffix(".html");
       springResourceTemplateResolver.setCharacterEncoding("UTF-8");
       return springResourceTemplateResolver;
  }

   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
      registry
            .addResourceHandler("/resources/**")
            .addResourceLocations("/resources/");
   }
}
1

in Config

public class SpringConfig implements WebMvcConfigurer {

    private final ApplicationContext applicationContext;

    @Autowired
    public SpringConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setCharacterEncoding("UTF-8");
        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());
        resolver.setCharacterEncoding("UTF-8");
        registry.viewResolver(resolver);
    }
}

In ServletInitializer

public class MySpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);
        return new Filter[] { filter };
    }
}
SuperStormer
  • 4,997
  • 5
  • 25
  • 35
psyopus
  • 51
  • 2
  • This is all good, until Filter[] getServletFilters(), that isn't in AbstractAnnotationConfigDispatcherServletInitializer, but in AbstractDispatcherServletInitializer. How did you override it? @psyopus – LosmiNCL Sep 05 '21 at 23:48
  • [Link to documentation](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer.html). AbstractAnnotationConfigDispatcherServletInitializer extends AbstractDispatcherServletInitializer – psyopus Sep 06 '21 at 16:31
0

If you have added <property name="characterEncoding" value="UTF-8"/> in the bean configuration for view resolver and still text are not shown in correct format then the problem is in the properties/resource_bundle files.

Try encoding UTF-8 or non-English characters with native2ascii tool. (its included in the java_home/bin folder.

ranjan
  • 351
  • 1
  • 5
  • 16
0

In my case, I put below 2 lines in application.properties file

spring.thymeleaf.enabled=true
spring.thymeleaf.encoding=UTF-8

(Korean)Reference: https://blog.thjang.net/33

Park JongBum
  • 1,245
  • 1
  • 16
  • 27
0

With Spring WebFlux, I've restricted the view resolver to use text/html; charset=UTF-8 as the only supported content type. I've used a custom WebFluxConfigurer for that (in Kotlin):

class CustomWebFluxConfigurer(
    private val viewResolver: ThymeleafReactiveViewResolver
) : WebFluxConfigurer {
    override fun configureViewResolvers(registry: ViewResolverRegistry) {
        viewResolver.supportedMediaTypes =
            listOf(MediaType.parseMediaType("text/html; charset=UTF-8"))
        registry.viewResolver(viewResolver)
    }
}
benweet
  • 3,685
  • 1
  • 21
  • 26
-2

I think in thymeleaf html page you are using th:text with html element, th:text it just display normal text,

if you want use special charter with your thymeleaf html page so just need to change for example

th:utext="${yourcontroller_var}"

or

th:utext="#{properties_var}"

For example

<div th:utext="${user.name}"> Test! </div> // for your controller variable 

And

<div th:utext="#{message.username}"> UserName! </div> // for your properties variable 

Nothing do other configuration for using special character with thymeleaf html page.

Hope you will fix your problem