Swagger2整合SpringBoot

·  阅读 930

Swagger2整合SpringBoot

Swagger2注解详细

@Api:用在请求的类上,表示对类的说明
    tags="说明该类的作用,可以在UI界面上看到的注解"
    value="该参数没什么意义,在UI界面上也看到,所以不需要配置"

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

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

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

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

1. @Api:用在请求的类上,说明该类的作用

@Api:用在请求的类上,说明该类的作用
    tags="说明该类的作用"
    value="该参数没什么意义,所以不需要配置"
复制代码

示例

@Api(tags="APP用户注册Controller")

2. @ApiOperation:用在请求的方法上,说明方法的作用

@ApiOperation"用在请求的方法上,说明方法的作用"
    value="说明方法的作用"
    notes="方法的备注说明"
复制代码

示例

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

3. @ApiImplicitParams:用在请求的方法上,包含一组参数说明

@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:用于请求的方法上,表示一组响应

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

示例

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

5. @ApiModel:用于响应类上,表示一个返回响应数据的信息

@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是一组开源项目,其中主要要项目如下:

  1. Swagger-tools: 提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger 2.0文档等功能。
  2. Swagger-core: 用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF...)、Servlets和Play框架进行集成。
  3. Swagger-js: 用于JavaScript的Swagger实现。
  4. Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
  5. Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
  6. Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。

POM引用

版本太高可能会报异常信息

<dependencies>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.6.1</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.6.1</version>
		</dependency>
	</dependencies>
复制代码

配置Swagger2Config

说明:该类跟Application同目录

/**
 * @Auther: zhangbh
 * @Date: 2019/10/8 09:41
 * @Description: Swagger2配置类
 * 在与SpringBoot集成时,放在与Application同级的目录下
 * 通过@Configuration注解,让Spring来加载该类配置
 * 再通过@EnableSwagger2注解来启用Swagger2
 */
@Configuration
@EnableSwagger2
public class Swagger2 {
    /**
     * 创建API应用apiInfo()增加API相关信息
     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现
     * 采用指定扫描的包路径来定义指定要建立API的目录
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket((DocumentationType.SWAGGER_2))
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.glodon"))
                .paths(PathSelectors.any())
                .build();
    }
    /**
     * 创建该API的基本信息(这些基本信息会展现在文档页面)
     * 访问地址:http://项目实际地址/swagger-ui.html
     * @return
     */
    private ApiInfo apiInfo() {
        //配置界面说明
        return new ApiInfoBuilder()
                //页面标题
                .title("gzzjz-zjfx接口文档")
                //描述
                .description("广州造价站-造价子系统接口文档")
                //创建人
                .contact("zhangbh")
                .version("1.0")
                .build();
    }
}
复制代码

如果不指定Http类型,默认是7中类型都支持

Conntroller中定义的方法必须在@RequestMapper中显示的指定RequestMethod类型,否则SawggerUi会默认为全类型皆可访问, API列表中会生成多条项目。

1570874938615

综合应用

Controller

@RestController
@RequestMapping("/user")
@Api(tsgs = {"UserController"}, description = "用户接口")
public class UserController {
	
	@PostMapping("/findUser")
	@ApiOperation(value="查询用户信息", notes="根据用户名,年龄等信息查询用户信息列表")
	@ApiImplicitParams({
		@ApiImplicitParam(paramType="query", name = "id", value = "请求标识", required = true, dataType = "String"),
	})
	@ApiResponses({
		@ApiResponse(code=201,message="成功1",response = UserVo.class),
		@ApiResponse(code=400,message="失败",response = UserVo.class)
	})
	public List<UserVo> findUser(@RequestParam String id, @RequestBody UserBo userBo){
		System.out.println(id);
		System.out.println(userBo.toString());
		
		List<UserVo> list = new ArrayList<UserVo>();
		
		UserVo e = new UserVo();
		e.setAge("age1");
		e.setUserName("userName1");
		e.setUserBo(userBo);
		list.add(e );
		
		UserVo e2 = new UserVo();
		e2.setUserBo(userBo);
		e2.setAge("age2");
		e2.setUserName("userName2");
		list.add(e2 );
		
		return list;
	}
}
复制代码

Entity

@ApiModel(value = "用户BO")
public class UserBo {
    @ApiModelProperty(value="用户名" ,required=true)
	 private String userName;
    @ApiModelProperty(value="年龄" ,required=true)
	 private String age;
    // 省略getter & setter方法
}
复制代码

API

1570875226450

注意

除了在拦截器中对Swagger路径放行之外

public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(logInterceptor).addPathPatterns("/**")
    	    .excludePathPatterns("/api1/heartbeat")
            .excludePathPatterns("/v2/api-docs")
            .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
复制代码

可能后台会报错

No mapping found for HTTP request with URI [/swagger-resources/configuration/ui] in DispatcherServlet with name 'dispatcherServlet'
复制代码

解决方案

这个错误,是因为资源映射问题导致。 我们在访问http://127.0.0.1:8188/swagger-ui.html 时,这个swagger-ui.html相关的所有前端静态文件都在springfox-swagger-ui-2.6.1.jar里面。目录如下:

1571206844456

Spring Boot自动配置本身不会自动把/swagger-ui.html这个路径映射到对应的目录META-INF/resources/下面。我们加上这个映射即可。代码如下:

public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

复制代码

Swagger解析

首页/swagger-ui.html

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

首页信息接口/v2/api-docs

地址:http://localhost:8080/v2/api-docs

参考

blog.csdn.net/sanyaoxu_2/…

分类:
后端
标签:
分类:
后端
标签: