• swagger下载文件名中文乱码、swagger导出文件名乱码、swagger文件导出名称乱码、解决swagger中文下载乱码bug


    一、场景描述: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版本

  • 相关阅读:
    C++ | Leetcode C++题解之第91题解码方法
    论文阅读_大模型_ToolLLM
    老照片修复神器,如何修复老照片的清晰度?
    企业电子招投标采购系统源码之电子招投标的组成
    51单片机项目(7)——基于51单片机的温湿度测量仿真
    算法与数据结构 --- 栈的表示和操作的实现
    STL源码剖析 | priority_queue优先队列底层模拟实现
    SpringBoot整合Activiti7——流程变量(五)
    一文详解 WebSocket 网络协议
    71页文档统一管理云平台项目建设方案
  • 原文地址:https://blog.csdn.net/weixin_49114503/article/details/139805076