解决Swagger2返回map复杂结构不能解析的问题

今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误。

Pom.xml引入的swagger版本如下:

<!--swagger start-->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.20</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
        <!--swagger end-->

具体原因:

swaggerconfig没有默认添加map的复杂结构引起的,需要手动添加。

步骤:

1. 找到swaggerconfig类,在Docket方法里添加一些mapRule即可

2. 这里设计rule比较灵活,我就按标题的格式添加,其中Model.class是自定义的业务类,换成自己的即可。

docket.alternateTypeRules(AlternateTypeRules.newMapRule(String.class, List.class));
docket.alternateTypeRules(AlternateTypeRules.newMapRule(List.class, Model.class));

具体代码如下:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build();

        docket.alternateTypeRules(AlternateTypeRules.newMapRule(String.class, List.class));
        docket.alternateTypeRules(AlternateTypeRules.newMapRule(List.class, Model.class));
        return docket;
    }
}

Swagger使用过程中遇到的坑

1、无限请求

如果swagger页面请求有错误,swagger会无限尝试访问,后面重启项目的时候,控制层会无限刷新出现日志的内容

本地的好办,如果项目项目部署到服务器中,可能十几分钟产生几个G的日志文件

解决方式:最简单的方式——关闭请求报错的浏览器

2、同名问题

@Api(同名的问题) 因为swagger会根据tags 的名称查找对象,有同名对象的时候,swagger的文档就会出现问题

如果swagger的某个API下出现不属于该API的请求,这个就是API的同名的问题,查找相同的API名称替换即可

3、类上的注解“/”的问题

@ApiModel(不能使用“/”)

Errors
Hide
Resolver error at paths./v1-0/Configuration/add.post.parameters.1.schema.properties.listHotCarBrandIVO.items.$ref
Could not resolve reference because of: Could not resolve pointer: /definitions/热门车/品牌/的IVO does not exist in document

4、使用map作为返回类型报错,

Errors
Hide
Resolver error at definitions.Map«string,List«卖车车辆信息OVO»».additionalProperties.$ref
Could not resolve reference because of: Could not resolve pointer: /definitions/List does not exist in document

两个解决方案:升级swagger版本号,这个是我用2.8.0报错会报错,网上有说升级版本可以解决,这个我没有去试,

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.8.0</version>
</dependency>

我这边的解决方案是,将map定义在对象中,面向对象编程,而且这样生成文档的时候,注释也会显示好

5、swagger版本的问题,2.8之前的版本在 路径/{id} +@pathVarisble 这样的写法

2.8之前,swagger给出的类型居然是body,需要用json的格式传这个很奇怪,

版本更新到2.8以后,路径后面绑定的参数就是 swagger给出的类型居然是就能是param

适当的更新版本有好处

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.8.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.8.0</version>
</dependency>

6、没有重现过的一个bug

Failed to execute 'fetch' on 'Window': Failed to parse URL from http://localhost/8765undefindFailed to parse URL from http://localhost/8765undefind

我一直重启项目 swagger没有重现问题

后来我修改请求你方法上的api注释,重启就可以,可能是swagger上api冲突,关键是这个没有提示,好晕;如果谁找到重现这个问题来说一下

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈springfox-swagger原理解析与使用过程中遇到的坑

    swagger简介 swagger确实是个好东西,可以跟据业务代码自动生成相关的api接口文档,尤其用于restful风格中的项目,开发人员几乎可以不用专门去维护rest api,这个框架可以自动为你的业务代码生成restfut风格的api,而且还提供相应的测试界面,自动显示json格式的响应.大大方便了后台开发人员与前端的沟通与联调成本. springfox-swagger简介 签于swagger的强大功能,java开源界大牛spring框架迅速跟上,它充分利用自已的优势,把swagger集成

  • 解决springboot集成swagger碰到的坑(报404)

    一:项目使用springboot集成swagger进行调试 配置swagger非常简单,主要有三步: 1.添加swagger依赖 <!-- 引入 swagger等相关依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version> <

  • 解决Swagger2返回map复杂结构不能解析的问题

    今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误. Pom.xml引入的swagger版本如下: <!--swagger start--> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>1.

  • 解决mybatis用Map返回的字段全变大写的问题

    mybatis通常情况都是用javabean作为resultType的对象,但是有时也可以使用Map去接收. <select id="execute" parameterType="String" resultType="java.util.HashMap"> ${value} </select> 如果使用Map,返回来的字段名全是大写,处理方法 Select name as "name" from v

  • Golang 语言map底层实现原理解析

    在开发过程中,map是必不可少的数据结构,在Golang中,使用map或多或少会遇到与其他语言不一样的体验,比如访问不存在的元素会返回其类型的空值.map的大小究竟是多少,为什么会报"cannot take the address of"错误,遍历map的随机性等等. 本文希望通过研究map的底层实现,以解答这些疑惑. 基于Golang 1.8.3 1. 数据结构及内存管理 hashmap的定义位于 src/runtime/hashmap.go 中,首先我们看下hashmap和buck

  • ThreadLocal数据存储结构原理解析

    目录 一:简述 二:TheadLocal的原理分析 1.ThreadLocal的存储结构 2.源码分析 set()方法 三:源码分析 createMap() 源码: 流程图: expungeStaleEntry() cleanSomeSlots() rehash() resize() get()方法 getEntry() getEntryAfterMiss() remove() 四:总结 一:简述 我们很多时候为了实现数据在线程级别下的隔离,会使用到ThreadLocal,那么TheadLoca

  • 解决微信返回上一页,页面中的AJAX的请求,对Get请求无效的问题

    先给大家分析问题产生原因 最近在做一个微信的项目时,遇到一种很常见的情况,需求是这样的,当用户进入到"我的个人中心"的时候,会有一个点击跳转填写认证资料的按钮,点击此按钮后,会跳转到认证资料填写页面,填写资料,提交成功后.当用户直接返回到上一页的时候.需要修改认证状态为"认证中".此时需要使用一个AJAX方法去查询认证状态,并修改页面的状态显示. 当时没有按照标准的方法写ajax方法,默认使用的方法是Get请求,前台JS代码如下: window.onload = f

  • Java开发中解决Js的跨域问题过程解析

    这篇文章主要介绍了Java开发中解决Js的跨域问题过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主流方法有JSONP和CORS两种,这里记一下后者的方式,理论基础就是在请求的时候在http请求头中添加如下属性: //指定允许其他域名访问 Access-Control-Allow-Origin:http://localhost:8989 如果后端用Java开发,在返回请求中可以添加如下属性 1.在跨域问题中,如果不操作cookie,只需

  • mybatis-plus返回map自动转驼峰配置操作

    mybatis-plus返回map自动转驼峰配置object-wrapper-factory不生效问题解决:配置map-underscore-to-camel-case: true不生效问题解决 很多时候我们工作中查询很多字段的时候一般是返回一个VO来接收,这个时候我们只要在yml中配置了 map-underscore-to-camel-case: true 就会自动将查询数据库的字段带下划线的属性转成对应实体类VO中驼峰命名的属性. 但是会经常有这种场景:例如我们只查询2个字段要返回给前端,这

  • 解决mybatis返回boolean值时数据库返回null的问题

    常规情况,我们使用数据库判断 true or false.所写的语句是select count(id) from 表名: 这种常用情况下,只有当查询语句查到数据 且 只有一条时才会返回 true; 还有一种情况,就是数据库中返回判断句,比如 返回的对错将以1或0表示: 但是当返回值为null,或者多个值的时候 会怎么样呢,0 1 还是报错? 测试表示这种情况下会报错: 希望大家使用 boolean 返回时 也能格外小心. 这里简单做了更改方法,可能不是最优化的,有更好的意见还请不吝赐教. 补充知

  • mybatis 返回Map类型key改为小写的操作

    默认情况下,当resultType="java.util.Map"时,返回的key值都是大写的. 现在想key改成自己想要的,只需为查询出来的字段增加个别名即可. 如: <select id="getStudentList" resultType="java.util.Map"> select t.name as "sName",t.sex as "sSex" from student <

  • pandas map(),apply(),applymap()区别解析

    基础 以下操作基于python 3.6 windows 10 环境下 通过 将通过实例来演示三者的区别 toward_dict = {1: '东', 2: '南', 3: '西', 4: '北'} df = pd.DataFrame({'house' : list('AABCEFG'), 'price' : [100, 90, '', 50, 120, 150, 200], 'toward' : ['1','1','2','3','','3','2']}) df map()方法 通过df.(ta

随机推荐