Swagger OpenAPI 3.0 - Springdoc - GroupedOpenApi在Spring MVC中无法工作

8

我的应用程序是Spring MVC而不是Spring Boot。

我正在使用springdoc-openapi-ui 1.4.4。

同时,我在我的@configuration类中添加了以下导入内容:

    org.springdoc.core.SpringDocConfigProperties.class, org.springdoc.core.SpringDocConfiguration.class, 
    org.springdoc.webmvc.core.SpringDocWebMvcConfiguration.class,
    org.springdoc.webmvc.core.MultipleOpenApiSupportConfiguration.class,
    org.springdoc.core.SwaggerUiConfigProperties.class, org.springdoc.core.SwaggerUiOAuthProperties.class,
    org.springdoc.webmvc.ui.SwaggerConfig.class, org.springdoc.core.CacheOrGroupedOpenApiCondition.class,
    org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.class })

实现豆子如下。
@Bean
public GroupedOpenApi publicApi() {
    return GroupedOpenApi.builder()
            .group("user")
            .pathsToExclude("/api/v2/**", "/v2/**")
            .pathsToMatch("/api/v1/**", "/v1/**")
            .build();
}
@Bean
public GroupedOpenApi adminApi() {
    return GroupedOpenApi.builder()
            .group("admin")
            .pathsToExclude("/api/v1/**", "/v1/**")
            .pathsToMatch("/api/v2/**", "/v2/**")
            .build();
}

@Bean
public OpenAPI customOpenAPI() {
    return new OpenAPI()
        .components(new Components())
        .info(new Info()
            .title("titleI")
            .version("1.0.0"));
}

当我尝试访问http://localhost:8080/MyApp/v3/api-docs/user时,出现404错误。但是我可以在http://localhost:8080/MyApp/v3/api-docs中找到所有的API列表。同时,在http://www.onlykalu.com:81/MyApp/swagger-ui/index.html?configUrl=/MyApp/v3/api-docs/swagger-config中也能看到所有的API列表,但是没有“定义下拉菜单”的选项。如果我添加以下内容:

springdoc.group-configs[0].group=user
springdoc.group-configs[1].group=admin

我将application.properties添加之后,得到了以下结果:

在此输入图片描述

我错在哪里呢?

我需要导入其他类才能让分组功能正常工作吗?

谢谢。


请问有人能帮我解决这个问题吗? https://dev59.com/5XIOtIcB2Jgan1znJG-_ - karthi_chellaiah
2个回答

5

你的问题也在这里得到了回答:

如上所述,你只需要将你的Bean定义放在一个专门的配置类中,并将其添加到springdoc-openapi Bean的导入中,以便使用同样的机制来加载这些Beans。

以下是正确的beans配置:

@Configuration
public class GroupsConfiguration {

    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder().group("user").pathsToExclude("/api/v2/**").pathsToMatch("/api/v1/**").build();
    }

    @Bean
    public GroupedOpenApi adminApi() {
        return GroupedOpenApi.builder().group("admin").pathsToExclude("/api/v1/**").pathsToMatch("/api/v2/**").build();
    }

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI().components(new Components()).info(new Info().title("Spring MVC REST API")
                .contact(new Contact().name("Rasika Kaluwalgoda")).version("1.0.0"));
    }

}

同时与GroupsConfiguration导入springdoc-openapi:

@Configuration
@Import({ org.springdoc.core.SpringDocConfigProperties.class,
        org.springdoc.webmvc.core.MultipleOpenApiSupportConfiguration.class,
        org.springdoc.core.SpringDocConfiguration.class, org.springdoc.webmvc.core.SpringDocWebMvcConfiguration.class,
        SwaggerUiConfigParameters.class, SwaggerUiOAuthProperties.class,
        org.springdoc.core.SwaggerUiConfigProperties.class, org.springdoc.core.SwaggerUiOAuthProperties.class,
        org.springdoc.webmvc.ui.SwaggerConfig.class, GroupsConfiguration.class,
        org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.class })
public class SwaggerConfig {

}

1
只有在没有显式导入的情况下才能正常工作。 - EmeraldTablet

0

我以前配置过一些类似的东西。在我的情况下,每个API版本都放在不同的包中,所以我还定义了如下的packageToScan

@Bean
public GroupedOpenApi publicApi1() {
    return GroupedOpenApi.builder()
            .group("user")
            .pathsToExclude("/api/v2/**")
            .pathsToMatch("/api/v1/**")
            .packagesToScan("com.my.app.v1")
            .build();
}

此外,我还需要创建WebMvcConfigurer的bean(我只是扩展了配置类),并配置PathMatchConfigurer
    public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer
            .addPathPrefix("api/v1", HandlerTypePredicate.forAnnotation(RestController.class)
            .and(HandlerTypePredicate.forBasePackage("com.my.app.v1")))
            .addPathPrefix("api/v2", HandlerTypePredicate.forAnnotation(RestController.class)
            .and(HandlerTypePredicate.forBasePackage("com.my.app.v2")));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接