我一直在尝试使用 Spring Security(非 spring-boot)将 Springfox-Swagger UI 3.0.0 添加到常规 Spring MVC 应用程序中,但无法弄清楚。我最近将 swagger-ui 合并到了 2 个 spring-boot 项目中,这更容易,没有任何问题。
我已经遵循了许多教程,但没有一个起作用。
我关注的最新教程是SpringFox的官方教程 我还关注了来自的演示项目 https://github.com/springfox/springfox-demos 更具体地说是 spring-xml-swagger 演示
对 /swagger-ui/、/swagger-ui/index.html、/swagger-ui.html 和 /v2/api-docs/ 的请求返回 404。
我也尝试过旧版本的 swagger-ui,但都不起作用。 由于这是一个公司项目,我不能透露太多,但任何建议都会很好。 如果有必要,我会尝试用一些配置代码更新这篇文章。
来自 pom.xml 的依赖项
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
Spring框架是5.2.x
我的 SwaggerConfig.class。
@EnableSwagger2
@EnableWebMvc
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Api Services")
.description("Api Services")
.version("v1")
.build();
}
@Bean
public UiConfiguration uiConfiguration() {
return UiConfigurationBuilder
.builder()
.defaultModelsExpandDepth(-1)
.build();
}
}
来自 xml 配置。
<mvc:resources mapping="/swagger-ui/**" location="classpath:/META-INF/resources/webjars/springfox-swagger-ui/"/>
<mvc:view-controller path="/swagger-ui/" view-name="forward:/swagger-ui/index.html"/>
<mvc:resources mapping="index.html" location="classpath:/META-INF/resources/webjars/springfox-swagger-ui/"/>
<bean id="swaggerConfig" class="com.example.config.SwaggerConfig"/>
好吧,我并不是很肯定地说这一点,但是根据我的经验,至少 Spring MVC 的某些方面似乎对 XML 和基于注释的配置的混合不满意。特别是
@EnableWebMvc
.
无论如何,我们的工作应用程序,使用 Spring 5.3.x 和 SpringFox 3.0,我们在
@EnableSwagger2
类中做了一些额外的事情,包括此处指定的内容:
http://springfox.github.io/springfox/docs/current/#changes-in-swagger-ui
对于非启动应用程序,springfox-swagger-ui 不再通过添加依赖项自动启用。它需要使用资源处理程序配置器(WebFluxConfigurer 或 WebMvcConfigurer)显式注册。
这个例子是从该页面复制的,这一定是我之前得到它的地方:
public class SwaggerUiWebMvcConfigurer implements WebMvcConfigurer {
private final String baseUrl;
public SwaggerUiWebMvcConfigurer(String baseUrl) {
this.baseUrl = baseUrl;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String baseUrl = StringUtils.trimTrailingCharacter(this.baseUrl, '/');
registry.
addResourceHandler(baseUrl + "/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
.resourceChain(false);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController(baseUrl + "/swagger-ui/")
.setViewName("forward:" + baseUrl + "/swagger-ui/index.html");
}
}
因此,虽然您的 XML 配置似乎是重复的,但如果使用 @EnableWebMvc
,则
也许必须在注释配置中。
和/或,为了在课堂上使用
@Bean
,您也必须在课堂上使用 @Configuration
。这是我们设置的另一个区别。
我的 Spring 和 SpringFox
pom.xml
摘录:
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring.version>5.3.30</spring.version>
<springfox.version>3.0.0</springfox.version>
</properties>
<dependencies>
...
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${springfox.version}</version>
</dependency>
</dependencies>
...
我们的配置类有这些注释:
@Configuration
@EnableWebMvc
@EnableSwagger2
@Import(springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration.class)
public class SpringFoxConfig implements WebMvcConfigurer {
(最后一项专门用于JSR-303验证意识;基本操作不需要它。)
最后,我认为我们单个 Spring XML 配置文件的唯一相关部分,它是通过
web.xml
从我们的 DispatcherServlet
文件加载的:
<context:annotation-config/>
<bean class="our.app.package.api.swagger.SpringFoxConfig"/>
与您的示例的其他潜在相关差异:
UiConfiguration
beanDocket
构建器中使用自定义/有限路径选择器:.apis(RequestHandlerSelectors.basePackage("our.app.package"))
(如果后者有所作为,我会感到惊讶。)
最后,在应用程序启动时,您是否在服务器日志中看到这样的条目? (如果启用了调试日志记录。)
12:17:51,960调试_org.springframework.web.servlet.HandlerMapping.Mappings:'resourceHandlerMapping'{/swagger-ui / ** = ResourceHttpRequestHandler [类路径[META-INF / resources / webjars / springfox-swagger-ui /] ]}
抱歉,我无法给出更专业、更确定的答案,但也许这至少有帮助。我至少可以确认非启动 SpringMVC 与 SpringFox 可以/确实工作。