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?