SpringMVC如何在⽣产环境禁⽤Swagger的⽅法Swagger 是⼀个规范和完整的框架,⽤于⽣成、描述、调⽤和可视化 RESTful 风格的 Web 服务。总体⽬标是使客户端和⽂
件系统作为服务器以同样的速度来更新。⽂件的⽅法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使⽤功能强⼤的API从未如此简单。好吧,以上是官⽅的说法,我直接复制的,在我看来swagger就是
⼀个接⼝⽂档管理器,以前我们写接⼝⼀般都是world编写,但是有⼀个问题就是测试的时候需要依赖第三⽅⼯具,GET的接⼝还好,直接浏览器打开,POST的只能依赖另外的⼯具了,⽽Swagger呢,可以直接通过代码中的注解⽣成接⼝⽂档(JavaEE),⼀般⼈都⽤这种⽅式,⽽且直接集成在项⽬中,⽅便成员查看,同时还能直接测试,另外Swagger的界⾯也不错,也许这就是我选择⽤Swagger的原因吧,直接官⽅说的RESTful 风格那个不⽤管,不是RESTful 风格的接⼝也能⽤,当然Swagger还有⼀种⽅式就是⼿动写接⼝说明了,这样的好处就是代码只有代码,因为⼀旦代码中添加了Swagger的接⼝注解后,代码量还是增加了不少,当然坏处就是你改完了代码,还要去改接⼝⽂档
SpringMVC集成springfox-swagger2和springfox-swagger-ui很简单,只需要两步:
(1)pom中添加依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
(2)添加Swagger的配置类:
@Configuration
@EnableSwagger2
@EnableWebMvc
@ComponentScan("ller")
public class SwaggerConfig{
}
但是,如何在⽣产环境禁⽤这些api⽂档呢?试了很多种⽅式,最终到⼀个简单实⽤的办法:
@Configuration
@EnableSwagger2
@EnableWebMvc
@ComponentScan("ller")
public class SwaggerConfig{
@Autowired
ConfigService configService;
@Bean
public Docket customDocket() {
ServerEnv() == ServerEnvEnum.ONLINE) {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfoOnline())
.select()
.())//如果是线上环境,添加路径过滤,设置为全部都不符合
.build();
}else {
springmvc选择题
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo());
}
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("XXX系统")
.description("XXX系统接⼝")
.license("")
.licenseUrl("")
.termsOfServiceUrl("")
.
version("1.0.0")
.contact(new Contact("","", ""))
.build();
}
private ApiInfo apiInfoOnline() {
return new ApiInfoBuilder()
.title("")
.description("")
.license("")
.licenseUrl("")
.termsOfServiceUrl("")
.
version("")
.contact(new Contact("","", ""))
.build();
}
}
应该还有更好的办法!
swagger必须要跟springmvc在同⼀个context才⾏,springmvc只是spring的⼀个⼦context。如果swagger让spring的context加载,那么swagger的那些url⽤springmvc的是拦截不到的!
所以,两种解决办法:
如果是使⽤注解的⽅式:
(1)spring-mvc的配置:
<!-- 使⽤Annotation⾃动注册Bean,只扫描@Controller -->
<context:component-scan base-package="un.yunbx" use-default-filters="false"><!-- base-package 如果多个,⽤“,”分隔 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="assignable" expression="un.yunbx.swagger.SwaggerConfig"/>
</context:component-scan>
注意要把swagger的配置加进来,同时:
(2)spring的配置:
<!-- 包扫描、注解相关 -->
<context:component-scan base-package="un.yunbx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="assignable" expression="un.yunbx.swagger.SwaggerConfig
"/>
</context:component-scan>
注意把swagger排除掉
(3)Swagger的配置:
@Configuration
@EnableSwagger2
@EnableWebMvc
@ComponentScan("ller")
public class SwaggerConfig{
}
注意@Configuration注解。
当然更推荐的办法是使⽤xml配置的⽅式,因为这样可以不⽤引⼊swagger的依赖包:
(1)spring-mvc的配置:
<!-- 使⽤Annotation⾃动注册Bean,只扫描@Controller -->
<context:component-scan base-package="un.yunbx" use-default-filters="false"><!-- base-package 如果多个,⽤“,”分隔 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<import resource="l" />
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans.xsd">
<description>SpringMVC Swagger Configuration</description>
<!-- swagger配置,⽣产环境置空 -->
<bean class="un.yunbx.swagger.SwaggerConfig" />
</beans>
注意:我们这⾥把swagger单独放到⼀个配置⽂件中,如果是线上环境,则⽂件内容为空,如果是线下测试环境,则配置上Swagger。
(2)spring的配置:
<!-- 包扫描、注解相关 -->
<context:component-scan base-package="un.yunbx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
(3)Swagger的配置:
@EnableSwagger2
@EnableWebMvc
public class SwaggerConfig{
@Bean
public Docket customDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.
apis(RequestHandlerSelectors.basePackage("ller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("XXX平台")
.description("XXX平台接⼝")
.license("")
.licenseUrl("")
.termsOfServiceUrl("")
.
version("1.0.0")
.contact(new Contact("","", ""))
.build();
}
}
注意:这⾥我们去掉了@Configuration,同时,修改我们的pom,配置多profile打包:
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-swagger.version}</version>
<scope>${swagger.scope}</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<scope>${swagger.scope}</scope>
<version>${springfox-swagger-ui.version}</version>
</dependency>
注意:这⾥的依赖的scope是动态设置的,如果是线上环境,我们把scope设置成provided就可以。
<profiles>
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
<swagger.scope>compile</swagger.scope>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
<swagger.scope>compile</swagger.scope>
</properties>
</profile>
<profile>
<id>online</id>
<properties>
<profiles.active>online</profiles.active>
<swagger.scope>provided</swagger.scope>
</properties>
</profile>
</profiles>
通过不同的profile给swagger的依赖设置不同的scope!
注意:springfox-swagger.version=2.7.0有bug,可以使⽤低版本2.6.1。太他妈的坑!以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论