zoukankan      html  css  js  c++  java
  • 你不知道的swagger技巧,顺带介绍一下lombok的坑

    一、前言:

    作为一个开发,写接口文档是最让人痛苦的一件事情了,因为必须注明出参和入参,一不小心偷个懒吧,前台就出问题了,或者更新不及时,前后端的相爱相杀的大戏就要上演了。swagger 的出现大大的解决了这个问题,但是有很大程度上并不是所有人都会用。结合自己的爬坑之旅来完整的介绍一下 swagger 的攻略。

    二、先用几张图说一下我们可能遇到的问题:

    2.1 入参完全没有参数说明

    image.png

    2.2 出参也没有任何的说明以及类型

    image.png

    三、简单集成:

    3.1 环境:

    • springboot 2.1.0.RELEASE
    • swagger
    <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>
    

    3.2 简单配置:

    @EnableSwagger2
    @Configuration
    public class SwaggerConfig {
        //swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    //为当前包路径
                    .apis(RequestHandlerSelectors.basePackage("com.yuebao.goldbang.controller"))
                    .paths(PathSelectors.any())
                    .build();
        }
        //构建 api文档的详细信息函数,注意这里的注解引用的是哪个
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    //页面标题
                    .title("粤宝黄金邦 API ")
                    //创建人
                    //.contact(new Contact("MarryFeng", "http://www.baidu.com", ""))
                    //版本号
                    .version("1.0")
                    //描述
                    .description("this api for yuebao goldbangs ")
                    .build();
        }
    }
    

    3.3 简单使用

    @RestController
    @Api(description = "this controller just for test some new feature or debug")
    @RequestMapping("/api/test/")
    public class TestFeatureController {
        @ApiOperation("测试一下 swagger 功能")
        @PostMapping("testSwagger")
        public ResResult testSwagger(SwaggerTest swaggerTest){
            swaggerTest.setAddr("湖北");
            swaggerTest.setAge(18);
            swaggerTest.setName("blog.fkxuexi.top");
            return ResResult.builder().data(swaggerTest).code(ResCode.SUCCESS).status(true).build();
        }
    }
    

    3.4 ResResult 实体

    这里是使用了lombok

    @ToString
    @Builder
    public class ResResult<T> {
        @Setter@Getter private Integer code;
        @Setter@Getter private boolean status;
        @Setter@Getter private T data;
        @Setter@Getter private String msg;
    }
    

    3.5 效果截图:

    image.png
    image.png
    这个就会出现我们最开始的时候的效果,但是这样给前端去弄,照样还是有问题,相当于是没有是一样的。所以下面我们介绍如何解决这个问题

    四、解决入参参数说明的问题

    4.1、使用下列注解完成

    • @ApiModel 注明这个类需要文档注释,但是就这一个还不够
    • @ApiModelProperty(“用户id”) 具体的注释参数的含义
    @ToString
    @Getter
    @Setter
    @ApiModel
    public class SwaggerTest {
        @ApiModelProperty("用户id")
        private Integer id;
        @ApiModelProperty("用户姓名,必须是英文(这只是个比方)")
        private String name;
        @ApiModelProperty("用户地址")
        private String addr;
        @ApiModelProperty("用户年龄")
        private Integer age;
    }
    

    4.2 效果截图:

    瞬间前后端又能相爱了,有木有
    image.png

    五、解决出参没有注释,没有类型的问题

    5.1 公共返回实体需要注意的地方

    公共实体的返回的数据类型需要是泛型的

    5.2 controller 请求方法返回值的改造

      @ApiOperation("测试一下 swagger 功能")
        @PostMapping("testSwagger")
        public ResResult<SwaggerTest> testSwagger(SwaggerTest swaggerTest){
            swaggerTest.setAddr("湖北");
            swaggerTest.setAge(18);
            swaggerTest.setName("blog.fkxuexi.top");
            return ResResult.<SwaggerTest>builder().data(swaggerTest).code(ResCode.SUCCESS).status(true).build();
        }
    

    5.3 改造后的效果图:

    世界从此和平,前端和后端又能愉快的一起玩耍
    image.png
    上述就是关于swagger 的一些使用技巧,当然一些常用的注解这里没有讲到,这个随便的百度一下就可以找到,就不在多余的赘述了。

    六、lombok的简介以及一些坑

    6.1 讲解一下 lombok的好处吧:

    lombok 不同于其他的注解,它是在编译期间动态的修改源码,其实可以达到反射一样的效果,但是它比反射更加的高效,是在编译器执行的。

    6.2 在使用的时候请避开下列的坑:

    具体的我就不再举例,因为好多我也忘了,但是我记得最好是不用这些注解

    6.2.1 慎用构造器注解

    因为构造器注解是不支持重载的,以及很多时候结合mybatis用会出现问题

    6.2.2 慎用builder 注解

    builder的模式的使用在结合mybatis的时候很多情况下也会出现问题

    6.2.3 选用builder注解:

    很多时候我们会创建公共的响应类,但是很多时候我们会把data的类型和msg的类型都设置为Object,此时构造方法难以区分这两个参数,所以这个时候使用builder 注解是最好的。

    博客首发地址csdn:https://blog.csdn.net/weixin_42849915
    简书地址:https://www.jianshu.com/u/4b48be4cf59f
    希望结识更多的乐于分享的伙伴一起前行

  • 相关阅读:
    window.parent 、window.top及window.self 详解
    js中的变量提升和函数提升
    IE不支持ES6语法的解决方案——Babel
    JavaScript 文件拖拽上传插件 dropzone.js 介绍
    C# DataTable 增加行与列
    group by 与 order by 一起使用的时候
    window.open传递多个参数
    Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
    ASP.NET中调用百度地图API
    C# 读取Excel中的数据到DataTable中
  • 原文地址:https://www.cnblogs.com/fkxuexi/p/10674041.html
Copyright © 2011-2022 走看看