• Spring Boot 中文乱码问题解决方案汇总


    使用 Spring Boot 开发,对外开发接口供调用,传入参数中有中文,出现中文乱码,查了好多资料,总结解决方法如下:

    第一步,约定传参编码格式

    不管是使用httpclient,还是okhttp,都要设置传参的编码,为了统一,这里全部设置为utf-8

    第二步,修改application.properties文件

    增加如下配置:

    spring.http.encoding.force=true
    spring.http.encoding.charset=UTF-8
    spring.http.encoding.enabled=true
    server.tomcat.uri-encoding=UTF-8

    此时拦截器中返回的中文已经不乱码了,但是controller中返回的数据依旧乱码。

    第三步,修改controller的@RequestMapping

    修改如下:

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

    这种方法的弊端是限定了数据类型,继续查找资料,在stackoverflow上发现解决办法,是在配置类中增加如下代码:

    @Configuration
    public class CustomMVCConfiguration extends WebMvcConfigurerAdapter {
    
        @Bean
        public HttpMessageConverter<String> responseBodyConverter() {
            StringHttpMessageConverter converter = new StringHttpMessageConverter(
                    Charset.forName("UTF-8"));
            return converter;
        }
    
        @Override
        public void configureMessageConverters(
                List<HttpMessageConverter<?>> converters) {
            super.configureMessageConverters(converters);
            converters.add(responseBodyConverter());
        }
    
        @Override
        public void configureContentNegotiation(
                ContentNegotiationConfigurer configurer) {
            configurer.favorPathExtension(false);
        }
    }

    便可以解决SpringBoot的中文乱码问题了。

    ps:stackoverflow网址

    http://stackoverflow.com/questions/27606769/how-to-overwrite-stringhttpmessageconverter-default-charset-to-use-utf8-in-sprin

    http://stackoverflow.com/questions/20935969/make-responsebody-annotated-spring-boot-mvc-controller-methods-return-utf-8

    在工作中新使用springboot 然后遇到了乱码问题 springboot 的配置文件方式和之前的srping mvc 有很大不同就让我很是困惑,先讲解我们开始使用的解决方案: 在application.properties 中增加

    spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8

    用来解决乱码问题

    然后发现在拦截器中返回的中文已经不乱码了。 在后续测试中发现controller中返回的数据依旧乱码,于是在 @RequestMapping中增加produces="text/plain;charset=UTF-8"

    但是总觉得要限定了请求的数据类型,所以继续研究,然后在查找的时候发现了HttpMessageConverter类 ,在其中的方法

    protected Long getContentLength(String str, MediaType contentType) { Charset charset = this.getContentTypeCharset(contentType);

    try {
        return Long.valueOf((long)str.getBytes(charset.name()).length);
    } catch (UnsupportedEncodingException var5) {
        throw new IllegalStateException(var5);
    }

    } 和 private Charset getContentTypeCharset(MediaType contentType) { return contentType != null && contentType.getCharset() != null?contentType.getCharset():this.getDefaultCharset(); }

    中发现 getContentTypeCharset的MediaType是入参的数据 里面的utf-8然后在getContentLength的MediaType 的编码是ISO-8859-1 看了下这个类中 ublic static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); 所以下面的主要工作就是修改这个默认编码 然后找到了下面两篇文章

    http://stackoverflow.com/questions/20935969/make-responsebody-annotated-spring-boot-mvc-controller-methods-return-utf-8 http://stackoverflow.com/questions/27606769/how-to-overwrite-stringhttpmessageconverter-default-charset-to-use-utf8-in-sprin

    package com.kotlin.springboot.nextj2ee.config
    
    import org.springframework.context.annotation.Bean
    import org.springframework.context.annotation.Configuration
    import org.springframework.http.converter.HttpMessageConverter
    import org.springframework.http.converter.StringHttpMessageConverter
    import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
    import java.nio.charset.StandardCharsets
    
    
    @Configuration
    class CustomMVCConfiguration : WebMvcConfigurerAdapter() {
    
        @Bean
        fun responseBodyConverter(): HttpMessageConverter<String> {
            return StringHttpMessageConverter(StandardCharsets.UTF_8)
        }
    
        override fun configureMessageConverters(
            converters: MutableList<HttpMessageConverter<*>>) {
            super.configureMessageConverters(converters)
            converters.add(responseBodyConverter())
        }
    
        override fun configureContentNegotiation(
            configurer: ContentNegotiationConfigurer) {
            configurer.favorPathExtension(false)
        }
    }

    完美解决了乱码问题

  • 相关阅读:
    maven
    in 和 or 的效率问题
    mac 安装homobrew 报错解决
    卷积的本质及物理意义
    java 多线程 day18 ThreadPoolExecutor
    打jar包
    科三保佑贴
    【问题解决】-《java.lang.NoClassDefFoundException》
    POS-商户手续费-从生活剖析,通俗易懂
    关于荒废空闲时光的思考
  • 原文地址:https://www.cnblogs.com/exmyth/p/15529041.html
Copyright © 2020-2023  润新知