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

简介: 使用 Spring Boot 开发,对外开发接口供调用,传入参数中有中文,出现中文乱码,查了好多资料,总结解决方法如下:第一步,约定传参编码格式不管是使用httpclient,还是okhttp,都要设置传参的编码,为了统一,这里全部设置为utf-8第二步,修改application.

使用 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)
    }
}

完美解决了乱码问题

相关文章
|
9天前
|
人工智能 Java Spring
Spring Boot循环依赖的症状和解决方案
Spring Boot循环依赖的症状和解决方案
|
9天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
65 0
|
9天前
|
缓存 前端开发 Java
13:SpringBoot跨域解决方案-Java Spring
13:SpringBoot跨域解决方案-Java Spring
91 0
|
9天前
|
消息中间件 NoSQL Java
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】
327 1
|
4天前
|
JSON 安全 前端开发
跨域详解及Spring Boot 3中的跨域解决方案
本文介绍了Web开发中的跨域问题,包括概念、原因、影响以及在Spring Boot 3中的解决方案。跨域是由浏览器的同源策略限制引起的,阻碍了不同源之间的数据传输。解决方法包括CORS、JSONP和代理服务器。在Spring Boot 3中,可以通过配置CorsFilter来允许跨域请求,实现前后端分离项目的正常运行。
56 3
 跨域详解及Spring Boot 3中的跨域解决方案
|
9天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
22 2
|
9天前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
9天前
|
缓存 Java 数据库
第8章 Spring Security 的常见问题与解决方案(2024 最新版)(下)
第8章 Spring Security 的常见问题与解决方案(2024 最新版)
34 0
|
9天前
|
安全 Java 数据安全/隐私保护
第8章 Spring Security 的常见问题与解决方案(2024 最新版)(上)
第8章 Spring Security 的常见问题与解决方案(2024 最新版)
38 0
|
9天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
33 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置