Swagger2

集成Swagger2

引入pom依赖

	<!--swagger2-->
	<dependency>
		<groupId>io.springfox</groupId>
		<artifactId>springfox-swagger2</artifactId>
		<version>${swagger2.version}</version>
	</dependency>
	<!--swagger2-ui-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger2.version}</version>
    </dependency>
    <!--swagger-bootstrap-ui-->
    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>swagger-bootstrap-ui</artifactId>
        <version>${swagger.bootstrap.version}</version>
    </dependency>

开启注解

在启动类中开启@EnableSwagger2注解

package com.example.swagger2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
@SpringBootApplication
public class Swagger2Application {
	public static void main(String[] args) {
		SpringApplication.run(Swagger2Application.class, args);
	}
}

配置基本信息

创建Swagger2Config配置类,并填充对应平台信息

package com.bonc.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.RestController;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * @date 2020-03-09
 */
@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class Swagger2Config {

    /**
     * 文件描述
     */
    @Value("${common.swagger.code.description:xxxx管理系统}")
    private String codeDescription;
    /**
     * 邮箱
     */
    @Value("${common.swagger.code.email:xxx@xxx.com.cn}")
    private String codeEmail;
    /**
     * 作者名称
     */
    @Value("${common.swagger.code.author:xxx}")
    private String codeName;
    /**
     * 文档标题
     */
    @Value("${common.swagger.code.title:xxx管理系统RESTful API}")
    private String codeTitle;
    /**
     * 作者Url
     */
    @Value("${common.swagger.code.url:https://www.xxxx.com.cn//}")
    private String codeUrl;
    /**
     * 版本
     */
    @Value("${common.swagger.code.version:1.0.0}")
    private String codeVersion;
    /**
     * 服务Url
     */
    @Value("${common.swagger.code.service.url:https://www.xxx.com.cn/}")
    private String serviceUrl;
    /**
     * 开启swagger
     */
    @Value("${common.swagger.code.enable:true}")
    private boolean enableSwagger;

    /**
     * 创建Api
     *
     * @return Docket
     */
    @Bean
    public Docket createRestApi() {
        List<Parameter> pars = new ArrayList<Parameter>();
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(enableSwagger)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(pars)
                .apiInfo(apiInfo());
    }

    /**
     * 初始化ApiInfo
     *
     * @return ApiInfo
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(codeTitle)
                .description(codeDescription)
                .termsOfServiceUrl(serviceUrl)
                .version(codeVersion)
                .contact(new Contact(codeName, codeUrl, codeEmail))
                .build();
    }
}

编写控制器

package com.example.swagger2.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@Controller
public class TestController {
    @GetMapping("/test")
    @ResponseBody
    public Map<String, Object> getMsg() {
        Map<String, Object> map = new HashMap<>();
        map.put("result", "response msg");
        return map;
    }
}

访问API界面

启动服务后,访问地址http://ip:port/swagger-ui.html,即可见swagger主页
或http://ip:port/项目名称/doc.html

常用配置

自定义响应消息

Swagger 允许我们通过 Docket 的 globalResponseMessage() 方法全局覆盖 HTTP 方法的响应消息,但是首先我们得通过 Docket 的 useDefaultResponseMessages 方法告诉 Swagger 不使用默认的 HTTP 响应消息,假设我们现在需要覆盖所有 GET 方法的 500 和 403 错误的响应消息,我们只需要在 SwaggerConfig.java 类中的 Docket Bean 下添加如下内容:

扫描包路径设置

只扫描com.example.swagger2.controller路径下的方法

 @Bean
 public Docket getDocket(){
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(swaggerDemoApiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.swagger2.controller"))
            .build();
    }

设置不需要生成接口文档的方法(自定义注解)

定义一个方法级别的注解,策略为运行时解析

package com.example.swagger2.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotIncludeSwagger {
}

(not(withMethodAnnotation(NotIncludeSwagger.class)))表示方法级别注解不执行

...
import static com.google.common.base.Predicates.not;
import static springfox.documentation.builders.RequestHandlerSelectors.withMethodAnnotation;

@Configuration
public class SwaggerConfig {
    @Bean
    public Docket getDocket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(swaggerDemoApiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.swagger2.controller"))
                .apis((not(withMethodAnnotation(NotIncludeSwagger.class))))
                .build();
    }

 ....

在对应方法上使用@NotIncludeSwagger即可,该方法不会显示在swagger接口文档页面

	@NotIncludeSwagger
    @GetMapping("/test")
    @ResponseBody
    public Map<String, Object> getMsg() {
        Map<String, Object> map = new HashMap<>();
        map.put("result", "response msg");
        return map;
    }

设置范围

使用paths()方法,可以通过正则方式指定需要匹配到的方法;
定义2个方法,分别以/test和/hello访问路径开头

	@GetMapping("/test/getMsg")
    @ResponseBody
    public Map<String, Object> getMsg() {
        Map<String, Object> map = new HashMap<>();
        map.put("result", "response msg");
        return map;
    }

    @PostMapping("/hello/getMsg2")
    @ResponseBody
    public Map<String, Object> getMsg2() {
        Map<String, Object> map = new HashMap<>();
        map.put("result", "response msg");
        return map;
    }

指定访问所有/test路径开头的方法

...
 .apis((not(withMethodAnnotation(NotIncludeSwagger.class))))
                .paths(PathSelectors.regex("/test/.*"))
                .build();

指定多个时使用or方法

.paths(or(PathSelectors.regex("/test/.*"), PathSelectors.regex("/hello/.*")))

三、常用注解

@Api

@Api 是类上注解,通过在控制器类上增加@Api 注解,可以给控制器增加描述和标签信息。
主要属性

注解属性类型描述
tagsString[]控制器标签(类的名称。可以有多个值,多个值表示多个副本)。
descriptionString控制器描述(该字段被申明为过期)。
@Api(tags = {"类名称信息"},description = "类描述信息")
public class TestController {}

@ApiOperation

@ApiOperation 写在方法上,通过在接口方法上增加 @ApiOperation 注解来展开对接口的描述。
主要属性

注解属性类型描述
valueString接口说明。
notesString接口发布说明。
tagsString[]标签。
responseClass<?>接口返回类型。
httpMethodString接口请求方式。
	@ApiOperation(value="接口描述",notes = "接口提示信息")
    @PostMapping("/test/getMovieInfo")
    @ResponseBody
    public MovieInfo getMovieInfo() {
        MovieInfo info = new MovieInfo();
        info.setName("当幸福来敲门");
        info.setRole("威尔史密斯");
        return info;
    }

@ApiParam

@ApiParam 写在方法参数前面。用于对参数进行描述或说明是否 为必添项等说明;

注解属性类型描述
nameString参数名称。
valueString参数描述。
requiredString是否必传字段。
public MovieInfo getMovieInfo(@ApiParam(value="电影名称",required = true) String name) {}

@ApiModel

@ApiModel 是类上注解,主要应用 Model,也就是说这个注解一 般都是写在实体类上;
value:实体对象名称;
description:实体对象描述信息;

@ApiModel(value = "电影实体对象",description = "电影实体对象描述")
public class MovieInfo {

    private Long id;    //主键
    private String name;    //电影名称
    private String role;    //主演
    private String area;    //地区(大陆、香港、美国)
	...
}

@ApiModelProperty

@ApiModelProperty 可以用在方法或属性上。可设置实体属性的相关描述;
value:String,字段说明。
name:String 重写字段名称。
dataType:Stirng 重写字段类型。
required:boolean 是否必填。
example:Stirng 举例说明。
hidden:boolean 是否在文档中隐藏该字段。
allowEmptyValue:boolean 是否允许为空。
allowableValues:String 该字段允许的值,当我们 API 的某个参数为枚举类型时,使用这个属性就可以清楚地告诉 API 使用者该参数所能允许传入的值。

	@ApiModelProperty(value = "电影名称",name = "name",required = true, example = "当幸福来敲门")
    private String name;    //电影名称

@ApiIgnore

@ApiIgnore 用于方法或类或参数上,表示这个方法或类被忽略,和上面自定义的@NotIncludeSwagger 注解功能相似;

@ApiIgnore
public boolean delete(@PathVariable("id") int id)

@ApiImplicitParam

@ApiImplicitParam 用在方法上,表示单独的请求参数,总体功能 和@ApiParam 类似;
name:属性名;
value:描述;
required:是否必填。取值:true:必填参数。false:非必填参数。
dataType: 参数的数据类型。取值:Long,String
paramType:查询参数类型,实际上就是参数放在那里。取值:path:以地址的形式提交数据,根据 id 查询用户的接口就是这种形式传参。query:Query string 的方式传参。header:以流的形式提交。form:以 Form 表单的形式提交。

	@ApiImplicitParam(name = "name",value = "电影名称",required = true,paramType = "query",dataType = "string")
    public MovieInfo getMovieInfo( String name) {}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strggle_bin

一毛不嫌少,十元不嫌多

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值