swagger的搭建与使用
关于搭建与使用,如果大家还不清楚的话,可以去看看我的上一篇文章
swagger 多包扫描
在开发中我们可能不需要扫描全部的包,可能只需要扫描部分包
环境
现在在swagger包下有分别有controller1和controller2两个包,现在只需要扫描这两个包,但又不能把swagger包下全部内容扫描
重写包扫描方法
由于使用RequestHandlerSelectors.basePackage()方法只能扫描一个包而不能扫描多个包,所以这里重写了包扫描方法
package com.springboot.swagger.configs;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.RequestHandler;
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;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(basePackage("com.white.swagger.controller1"+splitor+"com.white.swagger.controller2"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("后端接口标题")
.description("后端接口描述")
.contact(
new Contact("white", "note.abeffect.com", "shiku_li@163.com")
)
.version("1.0.0-SNAPSHOT")
.build();
}
// 定义分隔符,配置Swagger多包
private static final String splitor = ";";
/**
* 重写basePackage方法,使能够实现多包访问,复制贴上去
* @author teavamc
* @date 2019/1/26
* @param [basePackage]
* @return com.google.common.base.Predicate<springfox.documentation.RequestHandler>
*/
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
return input -> {
// 循环判断匹配
for (String strPackage : basePackage.split(splitor)) {
boolean isMatch = input.getPackage().getName().startsWith(strPackage);
if (isMatch) {
return true;
}
}
return false;
};
}
private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
}
这样就可以扫描到controller1和controller2下的内容了
controller1包下内容
controller1
package com.springboot.swagger.controller1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/controller1")
@Api(tags = "控制1")
public class Controller1 {
@GetMapping("/returnValue")
@ApiOperation(value = "返回Map对象")
@ApiImplicitParam(name = "value",value = "给我值就返回给你",required = true)
public Map returnValue(String value){
Map map = new HashMap();
map.put("value",value);
return map;
}
@GetMapping("/returnBean")
@ApiOperation(value = "返回Bean1对象")
@ApiImplicitParam(name = "value",value = "给我值就返回给你",required = true)
public Bean1 returnBean(String value){
Bean1 bean = new Bean1(value);
return bean;
}
@PostMapping(value = "/parmaterBean1",produces = "application/json")
@ApiOperation(value = "Bean1作为参数返回")
public Bean1 parmaterBean1(@RequestBody Bean1 bean1){
return bean1;
}
}
bean1
package com.springboot.swagger.controller1;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "实例1")
public class Bean1 {
@ApiModelProperty(value = "键")
private String key;
public Bean1(String key) {
this.key = key;
}
public Bean1() {
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
controller2包下内容
controller2
package com.springboot.swagger.controller2;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
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.ResponseBody;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/controller2")
@Api(tags = "控制2")
public class Controller2 {
@PostMapping("/returnOrigin")
@ResponseBody
@ApiImplicitParams({
@ApiImplicitParam(name = "key",value = "键",required = true)
,@ApiImplicitParam(name = "value",value = "值",required = true)
})
@ApiOperation(value = "返回map对象")
public Map returnOrigin(String key,String value){
Map map = new HashMap();
map.put("key",key);
map.put("value",value);
return map;
}
@PostMapping("/returnBean")
@ResponseBody
@ApiImplicitParams({
@ApiImplicitParam(name = "key",value = "键",required = true)
,@ApiImplicitParam(name = "value",value = "值",required = true)
})
@ApiOperation(value = "返回Bean2对象")
public Bean2 returnBean(String key,String value){
Bean2 bean = new Bean2(value,key);
return bean;
}
@PostMapping(value = "/parmaterBean2",produces = "application/json")
@ResponseBody
@ApiOperation(value = "Bean2作为参数返回")
public Bean2 parmaterBean2(@RequestBody Bean2 bean2){
return bean2;
}
}
bean2
package com.springboot.swagger.controller2;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "实例2")
public class Bean2 {
@ApiModelProperty(value = "值")
private String value;
@ApiModelProperty(value = "键")
private String key;
public Bean2(String value, String key) {
this.value = value;
this.key = key;
}
public Bean2() {
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}