Spring Boot 学习笔记 12 : Swagger 异常

  在以前的项目中使用 Word 编写 API 文档,便于在项目成员之间传播和离线阅读,但是这种方式十分落后,有很多不足,例如以下:

  1. API 数量较多时,维护和阅读困难

  2. 修改 API 时,需修改者维护版本修改记录

  3. API 特殊的数据格式如 json,使用 Word 编写困难

  在后来某个项目中同事使用了 Swagger 编写 API 文档。Swagger 是一个 API 文档自动生成框架,能够通过反射读取后端代码注解定义的 API 文档,减少了文档编写工作的工作量。但是好像并不支持离线阅读,而且一定程度上会造成代码污染。

  再后来开始使用一款开源的 API 文档管理工具 [小幺鸡](http://www.xiaoyaoji.cn/) ,该工具不仅可以生成离线文档,还可以在开发成员之间分享,协同编辑,使用十分方便。

  但是使用 Swagger 编写文档已经作为习惯保留下来。由于一直没有深入去研究这款文档生成框架,在最近的项目使用过程中出现了异常,现在先记录下来。


  1. 首先在 pom.xml 文件中添加 maven 依赖:

    <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>
    
  2. 编写员工和部门实体类:

    import lombok.Data;
    
    /**
     * @author smileorsilence
     * @date 2018/11/28
     */
    @Data
    public class Employee {
    
        private String name;
    
        private Department department;
    
    }
    
    import lombok.Data;
    
    import java.util.Set;
    
    /**
     * @author smileorsilence
     * @date 2018/11/28
     */
    @Data
    public class Department {
    
        private Set<Employee> employees;
    
    }
    
  3. 然后编写企业 DTO 类并使用框架提供的注解:

    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    /**
     * @author smileorsilence
     * @date 2018/11/28
     */
    @ApiModel("企业")
    @Data
    public class CompanyDTO {
    
        @ApiModelProperty("员工")
        private Employee employee;
    
    }
    
  4. 接着编写企业控制类并使用框架提供的注解:

    import com.mj.wcs.service.dto.user.CompanyDTO;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * @author smileorsilence
     * @date 2018/11/28
     */
    @Api("企业控制器")
    @Slf4j
    @Controller
    @RequestMapping("/api")
    public class CompanyController {
    
        @ApiOperation(value = "添加企业")
        @PostMapping(value = "/company")
        @ResponseBody
        public String createCompany(CompanyDTO company) {
            return "smileorsilence";
        }
    
    }
    
  5. 此时运行程序会抛出内存溢出异常:

    2018-11-28 15:59:45.649 ERROR 5192 --- [           main] o.s.boot.SpringApplication               : Application startup failed
    
    org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.StackOverflowError
    	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
    	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50)
    	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:348)
    	...
    	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
    	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
    	at com.mj.wcs.WCSApplication.main(WCSApplication.java:30)
    Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.StackOverflowError
    	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201)
    	at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
    	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
    	...
    Caused by: java.lang.StackOverflowError: null
    	at com.google.common.collect.Iterables.any(Iterables.java:623)
    	at springfox.documentation.schema.WildcardType.hasWildcards(WildcardType.java:42)
    	at springfox.documentation.schema.WildcardType$1.apply(WildcardType.java:83)
    	...
    	at com.google.common.collect.Iterators$7.computeNext(Iterators.java:650)
    	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
    	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
    	at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:91)
    	at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
    	at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:94)
    	at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
    	at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:94)
    	...
    

源码地址:

请点击这里

参考文章:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,下面是对这些内容的详细介绍: 1. Web框架:Spring Boot Spring Boot是一个用于构建独立的、生产级的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了一套强大的开发工具和约定,使开发者能够更快速地开发高效的应用程序。 2. 字段校验:Spring Validation Spring ValidationSpring框架提供的一种验证机制,它基于Java Bean Validation规范,可以用于对请求参数进行校验。通过使用注解和验证器,开发者可以轻松地定义和实现各种校验规则,确保数据的合法性。 3. 持久层:MyBatis-Plus MyBatis-Plus是MyBatis的增强工具库,提供了许多便捷的功能和增强特性,使得使用MyBatis更加简单和高效。它包含了一系列的操作方法和查询构造器,能够帮助开发者快速地完成数据库操作。 4. 接口文档:Swagger2 Swagger2是一个用于生成、描述、调试和可视化RESTful风格API的工具。它通过注解方式来定义API接口和参数,能够自动生成接口文档,并提供了交互式界面方便测试和调试。 5. 缓存:Redis Redis是一个开源的高性能键值对存储系统,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。它具有快速、可扩展和灵活的特点,常用于缓存、会话管理、消息队列等场景。 6. 工具:Hutool Hutool是一个Java工具包,提供了许多常用的工具类和方法,能够简化Java开发过程中的一些常见操作。例如,文件操作、日期时间处理、加密解密、字符串处理等,都可以借助Hutool提供的工具类来完成。 7. 资源存储:阿里云对象存储OSS 阿里云对象存储OSS(Object Storage Service)是一种海量、安全、低成本、高可靠的云存储服务。它提供了简单易用的API接口,可以用于存储和访问各种类型的数据,如图片、音视频文件、日志等。 8. 课程视频点播:阿里云视频点播VoD 阿里云视频点播VoD(Video on Demand)是一项基于云计算技术的在线视频点播服务。它提供了视频上传、转码、存储、播放等一系列功能,开发者可以将自己的课程视频等内容上传到阿里云服务器,并通过API进行管理和播放。 以上就是关于Spring BootSpring Validation、MyBatis-Plus、Swagger2、Redis、Hutool、阿里云对象存储OSS和阿里云视频点播VoD的详细介绍。如果您对其中任何一个内容有进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值