最近在公司项目当中 升级了Springboot 版本 出现一点小问题(乱码了)
访问地址 本文当中使用是httpClient 测试
### GET http://localhost:8081/ebook/list?pageNum=1&pageSize=10000 Accept: application/json
结果为
跑起来后 发现乱码了 就去百度了一下 后面发现百度上说的都设置还是没有效果 不知道是不是自己傻 没有找到对应文章
经过自己研究和看文档 有2种方式可以解决这个问题
解决方案 一
在配置文件中进行如下修改
# 解决接口返回中文都是乱码
server.servlet.encoding.charset=utf-8
server.servlet.encoding.force=true
server.servlet.encoding.enabled=true
访问一下 查看一下结果 如下
当然 你如果是.yml 配置的话 把配置文件那里复制一下 去这个网站生成一下就好了 网址如下http:// toyaml.com/index.html
解决方案二 自己写个类 继承 WebMvcConfigurationSupport 这个类 代码如下
package com.zw.wiki.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* 描述:
* 解决springboot 乱码问题
*
* @author mac
* @create 2021-09-28 6:45 PM
*/
@Configuration
public class MvcConfigGarbled extends WebMvcConfigurationSupport {
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
// 解决 Controller 返回普通文本中文乱码问题
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
// 解决 Controller 返回json对象中文乱码问题
if (converter instanceof MappingJackson2HttpMessageConverter) {
((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
}
}
}
原理如下
/**
* 这个方法为 RequestMappingHandlerAdapter 和 ExceptionHandlerExceptionResolver 提供了访问共享的 HttpMessageConverter 的能力
* RequestMappingHandlerAdapter 的职责就包括对于 @RequestMapping 注解的解析处理能力
* ExceptionHandlerExceptionResolver 的职责就包括对于 @ExceptionHandler 注解的解析处理能力
*/
protected final List<HttpMessageConverter<?>> getMessageConverters() {
if (this.messageConverters == null) {
this.messageConverters = new ArrayList<>();
/*
* 空方法,留给子类扩展
* 通过这个方法可以添加自己的针对特定内容类型的实例,则可以达到优先级最高,等同于屏蔽掉列表中其他同类型实例
*/
configureMessageConverters(this.messageConverters);
if (this.messageConverters.isEmpty()) {
// 添加默认的各种converter
addDefaultHttpMessageConverters(this.messageConverters);
}
/*
* 空方法,留给子类扩展
* 可以针对框架自带的默认的各种类型的 HttpMessageConverter 实例进行一些属性上的自定义设置
*/
extendMessageConverters(this.messageConverters);
}
return this.messageConverters;
}