SpringBoot + Swagger-UI 实现在线API文档

写在前面的,以下是https://github.com/macrozheng/mall-learning 对应的学习

1.前后端分离情况下,还是感觉有具体的页面操作比较安心

2.另外 Swagger-UI 是用来写在线API文档的(很关键,小型可以快速开发,对应Controller层接口改变,对应也相对应改变),不然要用对应文档第三方去写接口文档,语雀似乎是最近开放出来的,可以去了解一下

====================================================

进入实际操作

Swagger-UI 是HTML,javascript,CSS的一个集合,可以动态根据注解生成在线API文档

常用注解

1.@Api  用于修饰Controller类,生成Contriller的相关文档信息

2.@ApiOperation: 用于修饰Controller类中的方法,生成接口方法相关文档信息

3.@ApiParam : 用于修饰接口的参数,生成接口参数相关文档信息 (通常接受前端传值为vo最佳,如果单个或者个别比较少,创建一个vo类专门接受这类参数)

4.@ApiModelProperty : 用于修饰实体类的属性,当实体类是请求参数或返回结果时,直接生成相关文档信息

=========================================

配置部分


<!--Swagger-UI API文档生产工具-->

<dependency>

  <groupId>io.springfox</groupId>

  <artifactId>springfox-swagger2</artifactId>

  <version>2.7.0</version>

</dependency>

<dependency>

  <groupId>io.springfox</groupId>

  <artifactId>springfox-swagger-ui</artifactId>

  <version>2.7.0</version>

</dependency>

====================================================

然后是 Swagger-UI的java配置

有三个不同的选择

A.生成指定包下面的类的API文档

B.生成有指定注解的类API文档

C.生成有指定注解的方法的API文档

具体代码

package com.macro.mall.tiny.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.EnableSwagger2;

/**

* Swagger2API文档的配置

*/

@Configuration

@EnableSwagger2

public class Swagger2Config {

    @Bean

    public Docket createRestApi(){

        return new Docket(DocumentationType.SWAGGER_2)

                .apiInfo(apiInfo())

                .select()

                //为当前包下controller生成API文档

                .apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))

                //为有@Api注解的Controller生成API文档

//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))

                //为有@ApiOperation注解的方法生成API文档

//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))

                .paths(PathSelectors.any())

                .build();

    }

    private ApiInfo apiInfo() {

        return new ApiInfoBuilder()

                .title("SwaggerUI演示")

                .description("mall-tiny")

                .contact("macro")

                .version("1.0")

                .build();

    }

}

======================

然后是controller层添加Swagger注解


这里先是类加上注解 然后对应方法加上注解

这里已经可以满足一般的API文档注解了


=========================================================

进阶版本

结合之前的Mybatis Generator注释的生成规则

CommentGenerator为Mybatis Generator 的自定义注解生成器,修改addFieldComment方法使其生成Swagger的@ApiModelProperty注解来取代原来的方法注解,添加addJavaFileCOmment方法,使其能在import中导入@ApiModelProperty,否则需要手动导入该类,便于需要生成大量实体类场景

对应代码

package com.macro.mall.tiny.mbg;

import org.mybatis.generator.api.IntrospectedColumn;

import org.mybatis.generator.api.IntrospectedTable;

import org.mybatis.generator.api.dom.java.CompilationUnit;

import org.mybatis.generator.api.dom.java.Field;

import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

import org.mybatis.generator.internal.DefaultCommentGenerator;

import org.mybatis.generator.internal.util.StringUtility;

import java.util.Properties;

/**

* 自定义注释生成器

* Created by macro on 2018/4/26.

*/

public class CommentGenerator extends DefaultCommentGenerator {

    private boolean addRemarkComments = false;

    private static final String EXAMPLE_SUFFIX="Example";

    private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME="io.swagger.annotations.ApiModelProperty";

    /**

    * 设置用户配置的参数

    */

    @Override

    public void addConfigurationProperties(Properties properties) {

        super.addConfigurationProperties(properties);

        this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));

    }

    /**

    * 给字段添加注释

    */

    @Override

    public void addFieldComment(Field field, IntrospectedTable introspectedTable,

                                IntrospectedColumn introspectedColumn) {

        String remarks = introspectedColumn.getRemarks();

        //根据参数和备注信息判断是否添加备注信息

        if(addRemarkComments&&StringUtility.stringHasValue(remarks)){

//            addFieldJavaDoc(field, remarks);

            //数据库中特殊字符需要转义

            if(remarks.contains("\"")){

                remarks = remarks.replace("\"","'");

            }

            //给model的字段添加swagger注解

            field.addJavaDocLine("@ApiModelProperty(value = \""+remarks+"\")");

        }

    }

    /**

    * 给model的字段添加注释

    */

    private void addFieldJavaDoc(Field field, String remarks) {

        //文档注释开始

        field.addJavaDocLine("/**");

        //获取数据库字段的备注信息

        String[] remarkLines = remarks.split(System.getProperty("line.separator"));

        for(String remarkLine:remarkLines){

            field.addJavaDocLine(" * "+remarkLine);

        }

        addJavadocTag(field, false);

        field.addJavaDocLine(" */");

    }

    @Override

    public void addJavaFileComment(CompilationUnit compilationUnit) {

        super.addJavaFileComment(compilationUnit);

        //只在model中添加swagger注解类的导入

        if(!compilationUnit.isJavaInterface()&&!compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)){

            compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));

        }

    }

}

出现的效果是


然后是运行起来,看具体效果

接口地址:http://localhost:8080/swagger-ui.html


基本总结,对应文字类说明在实体类中生成,尽量我们后端可以让前端知道,他需要调用什么,以及调用的大概字段意思

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容