0

I've created a Spring Boot application that works perfectly fine in localhost, but I can't save Cyrillic letters to the database. Hibernate query is trying to save a [?????????] string to the database, so it is transformed before it reaches the database. In my database, Cyrillic works fine. All tables and columns are utf8mb4_unicode_ci.

I've tried this: utf8 charset with Thymeleaf Мумин's answer. But I don't have a problem viewing Cyrillic letters, I have a problem saving them.

In my application.properties:

server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=utf-8;

My EncodingConfig class:

package util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;

@Configuration
public class EncodingConfig
{
    private @Autowired AutowireCapableBeanFactory beanFactory;
    
    public FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean()
    {
        FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<CharacterEncodingFilter>();
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        beanFactory.autowireBean(characterEncodingFilter);
        characterEncodingFilter.setForceEncoding(true);
        characterEncodingFilter.setEncoding("UTF-8");
        registrationBean.setFilter(characterEncodingFilter);
        registrationBean.addUrlPatterns("/*");
        
        return registrationBean;
    }
}

MVCConfig class:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.Companyname.Controllers")
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((ISpringTemplateEngine) 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;
    }
}

I've put in pom file:

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

My controller method has this attribute in @RequestMapping annotation

produces = "text/plain;charset=UTF-8"

Everything works fine on localhost, but on actual web server (Linux, Tomcat) it's not working. Again, displaying utf characters works, but I can't save them, they are replaced by ?. Any ideas where should I search?

LosmiNCL
  • 155
  • 3
  • 21

1 Answers1

1

I have 2 suggenstions, you didn't mentioned what db u are using.

1# try to specifing unicode and utf-8 within the database url e.g.:

spring.datasource.url = jdbc:mysql://localhost:3306/dbname?useUnicode=true&amp;characterEncoding=UTF-8

2# Configuration as Code

public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        converters.add(stringHttpMessageConverter);
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
    }

hope it helps

Vladimir
  • 612
  • 3
  • 16
  • First suggestion helped, now it works. But I think you made a typo, you wrote: ?useUnicode=true&characterEncoding=UTF-8 I wrote ?useUnicode=true&amp&characterEncoding=UTF-8, & instead of ; – LosmiNCL Sep 06 '21 at 16:12
  • the & is korrekt. Its the html entity for & . https://stackoverflow.com/a/6322572/11260972 If encoded is not working for you, remove it totally and write: ?useUnicode=true&characterEncoding=UTF-8 – Vladimir Sep 07 '21 at 14:39