試用了swagger3仪糖,對springboot版本要求高不說听绳,還是存在一些問題的醒叁,況且感覺swagger2用著還可以灾炭,就用swagger2吧夫植!
springboot整合swagger2三步曲:導(dǎo)包讹剔、配置、使用
1. 導(dǎo)包
<!--引入swagger -->
<!-- 排除springfox-swagger2 引入的swagger-annotations详民、swagger-models 1.5.20版本延欠,手動引入1.5.21版本的jar。
因為在使用@ApiModelProperty注解在字段上時沈跨,如果字段的類型為Long或是int類型由捎, 那么程序啟動后,訪問swagger-ui.html的頁面饿凛,
程序會報錯: java.lang.NumberFormatException: For input string: "" -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
2. 添加配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Profile;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
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;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
// 定義分隔符,配置Swagger多包
private static final String splitor = ";";
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
// 指定掃描1個包
// .apis(RequestHandlerSelectors.basePackage("com.test.controller"))
// 掃描多包
.apis(scanBasePackage("com.test.controller"))
// 只有標記了@Api的類方法才會暴露出給swagger
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
// 只有標記了@ApiOperation的方法才會暴露出給swagger
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("接口文檔")
// .description("Demo接口測試")
.version("1.0.0-SNAPSHOT")
// .termsOfServiceUrl("")
.build();
}
/**
* 方法1:重寫basePackage方法狞玛,使能夠?qū)崿F(xiàn)多包訪問
*/
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 -> {
// 循環(huán)判斷匹配
for (String strPackage : basePackage.split(splitor)) {
boolean isMatch = input.getPackage().getName().startsWith(strPackage);
if (isMatch) {
return true;
}
}
return false;
};
}
@SuppressWarnings("deprecation")
private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
/**
* 方法2:切割掃描的包生成Predicate<RequestHandler>
*/
public static Predicate<RequestHandler> scanBasePackage(final String basePackage) {
if(StrUtil.isBlank(basePackage)){
throw new NullPointerException("basePackage不能為空,多個包掃描使用" + splitor + "分隔");
}
String[] controllerPack = basePackage.split(splitor);
Predicate<RequestHandler> predicate = null;
for (int i = controllerPack.length -1; i >= 0 ; i--) {
String strBasePackage = controllerPack[i];
if (StrUtil.isNotBlank(strBasePackage)) {
Predicate<RequestHandler> tempPredicate = RequestHandlerSelectors.basePackage(strBasePackage);
predicate = predicate == null ? tempPredicate : Predicates.or(tempPredicate,predicate);
}
}
if(predicate == null) {
throw new NullPointerException("basePackage配置不正確涧窒,多個包掃描使用" + splitor + "分隔");
}
return predicate;
}
}
3. 使用
swagger2使用