【问题标题】:Spring Boot + Thymeleaf + Tomcat post form replace cyrillic letters with?Spring Boot + Thymeleaf + Tomcat post form 用西里尔字母替换?
【发布时间】:2021-11-03 03:41:32
【问题描述】:

我创建了一个 Spring Boot 应用程序,它在 localhost 中运行良好,但我无法将西里尔字母保存到数据库中。 Hibernate 查询正在尝试将 [?????????] 字符串保存到数据库,因此它在到达数据库之前被转换。在我的数据库中,西里尔文工作正常。所有表和列都是utf8mb4_unicode_ci。

我试过这个:utf8 charset with Thymeleaf Мумин 的回答。但我在查看西里尔字母时没有问题,我在保存它们时遇到了问题。

在我的 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;

我的 EncodingConfig 类:

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 类:

@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;
    }
}

我已经放入 pom 文件:

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

我的控制器方法在@RequestMapping 注解中有这个属性

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

在 localhost 上一切正常,但在实际的 Web 服务器(Linux、Tomcat)上却无法正常工作。同样,显示 utf 字符有效,但我无法保存它们,它们被替换为?。我应该在哪里搜索任何想法?

【问题讨论】:

    标签: java spring-boot tomcat thymeleaf


    【解决方案1】:

    我有 2 条建议,你没有提到你使用的是什么 db。

    1# 尝试在数据库 url 中指定 unicode 和 utf-8 例如:

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

    2# 配置为代码

    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);
        }
    

    希望对你有帮助

    【讨论】:

    • 第一个建议有帮助,现在可以了。但我认为你打错字了,你写的是:?useUnicode=true&characterEncoding=UTF-8 我写的是 ?useUnicode=true&amp&characterEncoding=UTF-8,而不是 ;
    • &是 korrekt。它是 & 的 html 实体。 stackoverflow.com/a/6322572/11260972 如果编码不适合您,请将其完全删除并写入:?useUnicode=true&characterEncoding=UTF-8
    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多