Swagger 和 Spring MVC(非 spring-boot)

问题描述 投票:0回答:1

我一直在尝试使用 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 swagger-ui
1个回答
0
投票

好吧,我并不是很肯定地说这一点,但是根据我的经验,至少 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
    bean
  • 我们在
    Docket
    构建器中使用自定义/有限路径选择器:
    .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 可以/确实工作。

© www.soinside.com 2019 - 2024. All rights reserved.