文章目录
一、场景描述:swagger导出文件名称乱码
场景描述:springboot项目集成swagger2.9.2后,下载文件时若文件名有中文则乱码。
(1)依赖如下:
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
(2)下载文件乱码如下:
(3)java代码如下:
@Controller
@RequestMapping("/file")
public class FileController {
@GetMapping("/export1")
public void printSubmit1( HttpServletResponse response) throws Exception {
//获取模板位置
InputStream templateFileName = getClass().getResourceAsStream("/template/dataSourceDetailExport.xlsx");
String fileName = "测试文件";
List<List<String>> dataList = new ArrayList<>();
for(int i=0;i<3;i++){
List<String> data = new ArrayList<>();
for(int j=1;j<10;j++){
data.add(i+""+j);
}
dataList.add(data);
}
try {
//对文件名进行编码,防止中文乱码
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "max-age=0");
OutputStream os = response.getOutputStream();
EasyExcel.write(os).withTemplate(templateFileName).sheet().doWrite(dataList);;
} catch (IOException e) {
throw new Exception("导出excel表格失败!", e);
}
}
}
二、乱码原因
这是由于sweagger2.9.2版本问题导致的,在swagger2.9.2中下载是乱码的,但是直接在浏览器中输入请求下载就是正常的。
三、解决方法
3.1、方法一、在浏览器中输入地址下载
3.2、方法二、swagger升级为2.10.0及以上
需要将swagger升级为2.10.0及以上
重点:需要swagger包含的spring-plugin-core包是2.0.0.RELEASE版本,swagger包含的spring-plugin-metadata包是2.0.0.RELEASE版本
(1)依赖如下
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.10.0</version>
</dependency>
(2)swagger配置如下:
package com.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
import java.text.SimpleDateFormat;
import java.util.Date;
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig
{
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.demo")) //你自己的package
.paths(PathSelectors.any())
.build();
}
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("小工具"+"\t"+new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
.description("docker-compose")
.version("1.0")
.termsOfServiceUrl("")
.build();
}
}
(3)下载结果如下图
四、可能遇到的问题
4.1、DocumentationPluginsManager.java:152
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
springfox.documentation.spring.web.plugins.DocumentationPluginsManager.createContextBuilder(DocumentationPluginsManager.java:152)
The following method did not exist:
org.springframework.plugin.core.PluginRegistry.getPluginFor(Ljava/lang/Object;Lorg/springframework/plugin/core/Plugin;)Lorg/springframework/plugin/core/Plugin;
The method's class, org.springframework.plugin.core.PluginRegistry, is available from the following locations:
jar:file:/D:/maven/MavenRepository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar!/org/springframework/plugin/core/PluginRegistry.class
The class hierarchy was loaded from the following locations:
org.springframework.plugin.core.PluginRegistry: file:/D:/maven/MavenRepository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of org.springframework.plugin.core.PluginRegistry
若遇到以上问题,则先在swagger中排除以下依赖,并手动引入以下版本的依赖
<dependency>
<artifactId>spring-plugin-core</artifactId>
<groupId>org.springframework.plugin</groupId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<artifactId>spring-plugin-metadata</artifactId>
<groupId>org.springframework.plugin</groupId>
<version>2.0.0.RELEASE</version>
</dependency>
注意: spring-plugin-core-2.0.0.RELEASE版本需要与swagger2.10.0及以上版本配合使用。若swagger版本为2.9.2及以下,需要用低版本的spring-plugin-core-1.2.0.RELEASE版本