1. 程式人生 > >SpringBoot---Swagger文件管理應用

SpringBoot---Swagger文件管理應用

1、新增依賴

<dependencies>
		<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>

2、建立獨立的Maven子模組

a、Swagger配置類

package com.imooc;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

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.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
//@EnableConfigurationProperties(SwaggerInfo.class)
public class SwaggerConfig {
	
	@Autowired
	private SwaggerInfo swaggerInfo;

	@Bean
	public Docket controllerApi(){
		System.out.println("======swaggerInfo====="+swaggerInfo);
		Docket docket = new Docket(DocumentationType.SWAGGER_2)
				.groupName(swaggerInfo.getGroupName()) // 分組名
				.apiInfo(apiInfo());
		ApiSelectorBuilder builder = docket.select();
		if(!StringUtils.isEmpty(swaggerInfo.getBasePackage())){
			builder = builder.apis(RequestHandlerSelectors.basePackage(swaggerInfo.getBasePackage())); // 篩選顯示介面
		}
		if(!StringUtils.isEmpty(swaggerInfo.getAntPath())){
			builder = builder.paths(PathSelectors.ant(swaggerInfo.getAntPath()));
		}
		
		return builder.build();
	}
	
	public ApiInfo apiInfo(){
		return new ApiInfoBuilder()
				.title(swaggerInfo.getTitle())
				.description(swaggerInfo.getDescription())
				.termsOfServiceUrl("http://springfox.io")
				.contact("imooc")
				.license(swaggerInfo.getLicense())
				.version("2.0")
				.build();
	}
}

屬性配置類

package com.imooc;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * Swagger配置資訊
 * @author zemel
 *
 */
@Component
@ConfigurationProperties(prefix="swagger", ignoreUnknownFields = true)
public class SwaggerInfo {

	private String groupName = "controller";
	private String basePackage;
	private String antPath;
	private String title = "HTTP API";
	private String description = "管理端介面";
	private String license = "Apache License Version 2.0";
	public String getGroupName() {
		return groupName;
	}
	public void setGroupName(String groupName) {
		this.groupName = groupName;
	}
	public String getBasePackage() {
		return basePackage;
	}
	public void setBasePackage(String basePackage) {
		this.basePackage = basePackage;
	}
	public String getAntPath() {
		return antPath;
	}
	public void setAntPath(String antPath) {
		this.antPath = antPath;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public String getLicense() {
		return license;
	}
	public void setLicense(String license) {
		this.license = license;
	}
	@Override
	public String toString() {
		return "SwaggerInfo [groupName=" + groupName + ", basePackage=" + basePackage + ", antPath=" + antPath
				+ ", title=" + title + ", description=" + description + ", license=" + license + "]";
	}
	
}

b、其他工程應用方法有三種

1)一種直接在App.java中使用@Import註解匯入配置類

@SpringBootApplication
//@EnableMySwagger
@Import(SwaggerConfig.class)
public class App {

	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

2)編寫@Enable*的註解,在App.java中啟用

package com.imooc;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import org.springframework.context.annotation.Import;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({SwaggerConfig.class})
@EnableSwagger2 // 組合註解
public @interface EnableMySwagger {

}
@SpringBootApplication
@EnableMySwagger
public class App {

	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

3)在resource/META_INF/spring.factories下配置Config類

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.imooc.SwaggerConfig

3、在應用Swagger工程配置檔案(application.properties)

# 配置swagger
swagger.groupName=manager
swagger.basePackage=com.imooc.controller

4、Swagger功能使用

控制器,主要註釋帶@ApiXX

package com.imooc.controller;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.imooc.entity.Product;
import com.imooc.service.ProductService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@RestController
@RequestMapping("/products")
@Api(tags="order", description="產品相關")
public class ProductController {

	private static Logger log = LoggerFactory.getLogger(ProductController.class);
 
	@Autowired
	private ProductService productService;
	
	@ApiOperation(notes="根據隊員業務規劃新增相應產品", value="建立產品")
	@PostMapping
	public Product addProduct(@RequestBody Product product){
		
		log.debug("建立產品,引數:{}",product);
		
		Product result = productService.addProduct((product));
		
		log.debug("建立產品,結果:{}",result);
		
		return result;
	}
	
	@GetMapping("/{id}")
	public Product findOne(@PathVariable String id){
		log.debug("查詢單個產品,id={}", id);
		
		Product product = productService.findOne(id);
		
		log.debug("查詢單個產品,結果={}", product);
		return product;
	}
	
	@GetMapping
	public Page<Product> query(String ids, BigDecimal minRewardRate, BigDecimal maxRewardRate, String status, 
			@RequestParam(defaultValue = "0")int pageNum, @RequestParam(defaultValue = "10") int pageSize){
		
		log.info("查詢產品,idList={},minRewardRate={},maxRewardRate={},statusList={},pageNum={},pageSize={}",ids, minRewardRate,maxRewardRate,status,pageNum,pageSize);
		
		List<String> idList = null;
		List<Integer> statusList = null;
		if(!StringUtils.isEmpty(ids)){
			idList = Arrays.asList(ids.split(","));
		}
		if(!StringUtils.isEmpty(statusList)){
			String[] statusStr = status.split(",");
//			statusStr.m
			Integer[] statusInt = new Integer[statusStr.length];
			for(int i=0; i<statusStr.length; i++){
				statusInt[i] = Integer.parseInt(statusStr[i]);
			}
			statusList = Arrays.asList(statusInt);
		}
		
		Pageable pageable = PageRequest.of(pageNum, pageSize);
		Page<Product> page = productService.query(idList, minRewardRate, maxRewardRate, statusList, pageable);
		log.info("查詢產品,結果={}", page);
		
		return page;
	}
	
}

實體類中使用

@ApiModel(value="ppp", description="產品模型")
@Entity
@Table(name="product_t")
public class Product {
	
	@Id
	@Column(name="id",columnDefinition="varchar(50) comment '產品編號'")
	private String id;
	
	@Column(name="name",columnDefinition="varchar(50) not null default '' comment '產品名稱'")
	private String name;
	
	/**
	 * @see com.imooc.entity.enums.ProductStatus
	 */
	@ApiModelProperty(value="狀態", dataType="com.imooc.entity.enums.ProductStatus")
	@Column(name="status",columnDefinition="smallint(6) not null default 0 comment '狀態,1:稽核中、2:銷售中、3:暫停銷售、4:已結束' ")
	private Integer status;
}