swagger的引入与使用

2022-07-06 14:49:31

1.首先引入依赖

<!-- swagger2 -->
<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>

2.swagger配置文件,写在项目包下的config文件夹

package com.supconit.study.mybatis.xmltest.config;
import com.google.common.base.Predicates;
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.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
public class CustomSwaggerConfig {

    @Configuration
    @EnableSwagger2
    public static class SwaggerConfig {

        @Bean
        public Docket webApiConfig(){
            return new Docket(DocumentationType.SWAGGER_2)
                    .groupName("webApi")
                    .apiInfo(webApiInfo())
                    .select()
                    .build();
        }

        private ApiInfo webApiInfo(){
            return new ApiInfoBuilder()
                    .title("电商平台")
                    .description("本文档描述了某某电商平台微服务接口定义")
                    .version("1.0")
                    .contact(new Contact("111", "http://somc.top", "xxx@163.com"))
                    .build();
        }
    }
}

3.启动swagger:

可能会遇到下面的错误,这个的根本原因就是config文件没有扫描到。

有两种解决办法:

1.直接把@EnableSwagger2注解加在主启动类就可以,这样虽然能解决问题,但是这样会扫到使用的框架的接口,这种方法要慎用。

2.主启动类加上@ComponentScan("swagger配置类所在包"),以保证配置类被扫描到

最后解决问题之后就可以访问 你的配置文件的相关端口了,http://localhost:xxxx/swagger-ui.html

4.常用注解

@Api()用于类表示标识这个类是swagger的资源
@ApiOperation()用于方法表示一个http请求的操作
@ApiParam()用于方法,参数,字段说明表示对参数的添加元数据(说明或是否必填等)
@ApiModel()用于类表示对类进行说明,用于参数用实体类接收
@ApiModelProperty()用于方法,字段表示对model属性的说明或者数据操作更改
@ApiIgnore()用于类,方法,方法参数表示这个方法或者类被忽略
@ApiImplicitParam()用于方法表示单独的请求参数
@ApiImplicitParams()用于方法包含多个 @ApiImplicitParam

1、@Api:用在请求的类上,说明该类的作用
     tags="":说明该类的作用,如果tags有多个值,会生成多个list
     value="":该参数没什么意义,在UI界面上也看不到,所以不需要配置

示例:

@Api(value="用户controller",tags={"用户操作接口"})
@RestController
public class UserController { }

2、@ApiOperation:用在请求的方法上,说明方法的用途、作用
    value="":说明方法的作用
    notes="":方法的备注说明

示例:

@ApiOperation(value="用户注册",notes="手机号、密码都是必输项,年龄随便填,但必须是数字")

3、@ApiImplicitParams:用在请求的方法上,包含一组参数说明
     @ApiImplicitParam:用在 @ApiImplicitParams 注解中,指定一个请求参数的配置信息
        name:参数名
        value:参数的汉字说明、解释
        required:参数是否必须传
        paramType:参数放在哪个地方
            · header --> 请求参数的获取:@RequestHeader
            · query --> 请求参数的获取:@RequestParam
            · path(用于restful接口)--> 请求参数的获取:@PathVariable
            · body(不常用)
            · form(不常用)
        dataType:参数类型,默认String,其它值dataType="Integer"
        defaultValue:参数的默认值

示例:

@ApiImplicitParams({
    @ApiImplicitParam(name="mobile",value="手机号",required=true,paramType="form"),
    @ApiImplicitParam(name="password",value="密码",required=true,paramType="form"),
    @ApiImplicitParam(name="age",value="年龄",required=true,paramType="form",dataType="Integer")

})

4、@ApiResponses:用于请求的方法上,表示一组响应
     @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
        code:数字,例如400
        message:信息,例如"请求参数没填好"
        response:抛出异常的类

示例:

@ApiOperation(value = "select1请求",notes = "多个参数,多种的查询参数类型")
@ApiResponses({
    @ApiResponse(code=400,message="请求参数没填好"),
    @ApiResponse(code=404,message="请求路径没有或页面跳转路径不对")
})


5、@ApiModel:用于响应类上,表示一个返回响应数据的信息
            (这种一般用在post创建的时候,使用@RequestBody这样的场景,
            请求参数无法使用@ApiImplicitParam注解进行描述的时候)
     @ApiModelProperty:用在属性上,描述响应类的属性

示例:

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;

@ApiModel(description= "返回响应数据")
public class RestMessage implements Serializable{

    @ApiModelProperty(value = "是否成功")
    private boolean success=true;
    @ApiModelProperty(value = "返回对象")
    private Object data;
    @ApiModelProperty(value = "错误编号")
    private Integer errCode;
    @ApiModelProperty(value = "错误信息")
    private String message;
    /* getter/setter */
}

使用swagger过程中常见的问题:

访问方式是ip:port/swagger-ui.html或者ip:port/doc.html
注意修改映射或者注意访问地址的变动

在使用时可能会出现这样的错误,No operations defined in spec!(规范中没有定义操作!)

解决方法:这样的问题一般是注册@Api的类所在的包没有扫描到(配置中没有定义接口api):

原因1

1.swagger配置类中配置controller的包路径出错(可能性最大)

原因2

controller层的swagger注解配置有误

原因3

启动类的注解配置有问题:@ComponentScan("com.xxx.config")

    @EnableFeignClients//启动Fegin支持
    @EnableDiscoveryClient//启动DiscoveryClient支持(用于服务注册和发现,可获取到注册中心的所有服务)
    @EntityScan(basePackages = {"com.xxx"})
    @ComponentScan("com.xxx.config")
    @SpringBootApplication
    public class OrderApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    }

由此可见是因为这个注解,指定了包路径,导致项目忽略了controller包路径,从而导致api丢失
解决方法就是去掉@componentScan:

    @EnableFeignClients//启动Fegin支持
    @EnableDiscoveryClient//启动DiscoveryClient支持(用于服务注册和发现,可获取到注册中心的所有服务)
    @EntityScan(basePackages = {"com.xxx"})
    @SpringBootApplication
    public class OrderApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    }
  • 作者:肆〇
  • 原文链接:https://blog.csdn.net/m0_51660523/article/details/120427680
    更新时间:2022-07-06 14:49:31