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原理解析与使用过程中遇到的坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值