Spring和Swagger文档规范整合详解

Spring和Swagger文档规范整合详解

一、概述

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新 。接口的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。

swagger可以与Spring MVC程序配合组织出强大RESTful API文档。它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能 来调试每个RESTful API。

代码可以在Spring组件化构建https://www.pomit.cn/java/spring/spring.html中的RabbitMQ组件中查看,并下载。

首发地址:
品茗IT-同步发布

品茗IT 提供在线支持:

一键快速构建Spring项目工具

一键快速构建SpringBoot项目工具

一键快速构建SpringCloud项目工具

一站式Springboot项目生成

Mysql一键生成Mybatis注解Mapper

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

二、环境配置

本文假设你已经引入Spring必备的一切了,已经是个Spring项目了,如果不会搭建,可以打开这篇文章看一看《Spring和Spring Mvc 5整合详解》

2.1 maven依赖

使用swagger需要引入springfox-swagger2,如果要使用swagger的界面,需要引入springfox-swagger-ui。

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>cn.pomit</groupId>
		<artifactId>SpringWork</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>Swagger</artifactId>
	<packaging>jar</packaging>
	<name>Swagger</name>
	<url>http://maven.apache.org</url>
	<properties>
		<!-- redis 版本 -->
		<redis.version>2.9.0</redis.version>
		<spring.redis.version>2.0.10.RELEASE</spring.redis.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
		</dependency>

		<!--log4j-core -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
		</dependency>
		
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.9.2</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>Swagger</finalName>
	</build>
</project>


父模块可以在https://www.pomit.cn/spring/SpringWork/pom.xml获取。

除了依赖,这里使用注解,将不需要其他配置。

三、Swagger配置

3.1 启动Swagger

SwaggerConfig:

package cn.pomit.springwork.swagger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

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;

@EnableWebMvc
@Configuration
@EnableSwagger2
public class SwaggerConfig {

	@Bean
	public Docket createRestApi() {
		return new Docket(DocumentationType.SWAGGER_2)
				.apiInfo(apiInfo())
				.select()
				.apis(RequestHandlerSelectors.basePackage("cn.pomit.springwork"))
				.paths(PathSelectors.any())
				.build();
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("API文档")
				.description("简单优雅的restful风格")
				.version("1.0")
				.build();
	}

}

这里,@EnableSwagger2开启Swagger。@EnableWebMvc注解加上才能正常显示Swagger的界面,不加的话页面根本打不开。

3.2 手动增加Swagger接口说明

有时候,Swagger是获取不到一些接口的信息,这样在界面上就无法显示出这些接口信息。如由SpringSecurity控制的登入等登出接口,这时候我们可以手动添加这些接口:

SwaggerAddtionScanConfig:

package cn.pomit.springwork.swagger.config;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;

import com.fasterxml.classmate.TypeResolver;

import cn.pomit.springwork.swagger.entity.TestEntity;
import springfox.documentation.builders.OperationBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiDescription;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.ApiListingScannerPlugin;
import springfox.documentation.spi.service.contexts.DocumentationContext;
import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator;

/**
 * 该文件可有可无,手动增加接口的方法
 * @author fufei
 *
 */
@Component
public class SwaggerAddtionScanConfig implements ApiListingScannerPlugin {
	@Override
	public List<ApiDescription> apply(DocumentationContext documentationContext) {
		return new ArrayList<>(
				Arrays.asList(
						new ApiDescription("Login", "/login", "登录接口",
								Collections
										.singletonList(
												new OperationBuilder(new CachingOperationNameGenerator()).authorizations(new ArrayList<>())
														.method(HttpMethod.POST)
														.summary("登录接口")                                                
														.notes("登录接口")//方法描述                                                
														.tags(Collections.singleton("登录登出模块"))//归类标签
														.produces(Collections.singleton("application/json"))
														.consumes(Collections.singleton("application/json"))
														.parameters(
																Arrays.asList(
																		new ParameterBuilder()
																				.description("email")
																				.type(new TypeResolver()
																						.resolve(String.class))
																				.name("email")
																				.parameterType("query")
																				.parameterAccess("access")
																				.required(true)
																				.modelRef(new ModelRef("string"))
																				.build(),
																		new ParameterBuilder()
																		.description("password")
																		.type(new TypeResolver()
																				.resolve(String.class))
																		.name("password")
																		.parameterType("query")
																		.parameterAccess("access")
																		.required(true)
																		.modelRef(new ModelRef("string"))
																		.build()
																				))
														.responseMessages(responseMessages())
														.build()),
								false),
						new ApiDescription("Login",
								"/logout", "登出接口",
								Collections
										.singletonList(
												new OperationBuilder(new CachingOperationNameGenerator()).authorizations(new ArrayList<>())
														.method(HttpMethod.POST)
														.summary("登出接口")                                                
														.notes("登出接口")//方法描述                                                
														.tags(Collections.singleton("登录登出模块"))//归类标签
														.produces(Collections.singleton("application/json"))
														.parameters(
																Collections
																		.singletonList(new ParameterBuilder()
																				.description("token")
																				.type(new TypeResolver()
																						.resolve(String.class))
																				.name("token")
																				.parameterType("query")
																				.parameterAccess("access")
																				.required(true)
																				.modelRef(new ModelRef("string"))
																				.build()))
														.responseMessages(responseMessages())
														
														.build()),
								false)));

	}

	/**
	 * @return Set of response messages that overide the default/global response
	 *         messages
	 */
	private Set<ResponseMessage> responseMessages() { // <8>
		return Collections.singleton(
				new ResponseMessageBuilder().code(200).message("Successfully received bug 1767 or 2219 response")
						.responseModel(new ModelRef(
								TestEntity.class.getSimpleName())
								).build());
	}

	@Override
	public boolean supports(DocumentationType documentationType) {
		return DocumentationType.SWAGGER_2.equals(documentationType);
	}
}

四、测试Swagger

我们使用一些Swagger的注解来做测试,如果不加注解其实也是可以的,但是不方便观看,加注解的话可以显示写的内容。

SwaggerRest :

package cn.pomit.springwork.swagger.web;

import java.util.UUID;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import cn.pomit.springwork.swagger.entity.TestEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(tags = {"测试模块"}, produces = "application/json")
@RestController
@RequestMapping("/swagger")
public class SwaggerRest {
	
	@ApiOperation(value = "测试swagger的功能")
	@RequestMapping(value = "/test", method = { RequestMethod.GET })
	public TestEntity test(@RequestParam String reqType) {
		String uuid = UUID.randomUUID().toString();
		String welMsg = "welcome 程序猿";
		if (reqType != null && "1000".equals(reqType)) {
			welMsg = "welcome 程序媛";
		}
		TestEntity welEntity = new TestEntity();
		welEntity.setUuid(uuid);
		welEntity.setWelMsg(welMsg);
		return welEntity;
	}
	
	@RequestMapping(value = "/test2", method = { RequestMethod.GET })
	public TestEntity test2(@RequestParam String reqType) {
		String uuid = UUID.randomUUID().toString();
		String welMsg = "welcome 程序猿";
		if (reqType != null && "1000".equals(reqType)) {
			welMsg = "welcome 程序媛";
		}
		TestEntity welEntity = new TestEntity();
		welEntity.setUuid(uuid);
		welEntity.setWelMsg(welMsg);
		return welEntity;
	}
}

五、过程中用到的实体

TestEntity:

详细完整的实体,可以访问品茗IT-博客《Spring和Swagger文档规范整合详解》进行查看

全部代码可以在Spring组件化构建https://www.pomit.cn/java/spring/spring.html中的Swagger组件中查看,并下载。

快速构建项目

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot技术吧!
品茗IT交流群

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开源的Java开发框架,而Swagger是一个用于构建、发布、文档化和管理API的工具。下面详细介绍如何在Spring Boot中整合Swagger。 首先,你需要在pom.xml文件中添加Swagger的依赖项。在<dependencies>标签中添加以下代码: ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.10.5</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.10.5</version> </dependency> ``` 然后,你需要在Spring Boot的配置类中添加相关的注解和配置。创建一个SwaggerConfig.java文件,添加以下代码: ```java @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("your.package.name")) .paths(PathSelectors.any()) .build(); } @Bean public UiConfiguration uiConfig() { return new UiConfiguration(null, "list", "alpha", "schema", UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS, false, true, 60000L); } } ``` 在上面的代码中,你需要将"your.package.name"替换为你的应用程序的包名。这将扫描该包下的所有控制器,生成API文档。 接下来,你可以启动你的Spring Boot应用程序,并访问"http://localhost:8080/swagger-ui.html"来查看生成的API文档。你将看到所有的控制器和它们的方法以及相关的参数和注释。 如果你想修改API的文档信息,你可以使用Swagger中的注解来添加说明和标注。例如,你可以在控制器的方法上添加@ApiOperation注解来描述该方法的作用。 综上所述,将Swagger整合Spring Boot中是很简单的。你只需要添加依赖项,配置SwaggerConfig类,然后访问Swagger UI来查看生成的API文档。同时,你可以使用Swagger注解来进一步完善API文档。希望这个教程可以帮助你理解如何在Spring Boot中使用Swagger
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值