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);
}
}