java 如何在sprinddoc中添加未从操作引用的类?

8wigbo56  于 2022-12-02  发布在  Java
关注(0)|答案(4)|浏览(156)

我使用的是springdoc,其中spring-boot主要配置了注解。
我想公开一个没有被任何服务引用的特定类架构。可以这样做吗?
在伪代码中,我实际上是在尝试这样做:
GroupedOpenAPI.parseAndAddClass(Class<?> clazz);

GroupedOpenAPI.scan("my.models.package");
===更新===
我设法使用ModelConverters.getInstance().readAll(MyClass.class);解析了架构
然后尝试将其添加为OpenApiCustomiser,但它在UI中仍然不可见。

cyvaqqii

cyvaqqii1#

在SpringDoc中,可以使用OpenApiCustomiser向生成的规范中添加一个非相关类

@Bean
public OpenApiCustomiser schemaCustomiser() {
    ResolvedSchema resolvedSchema = ModelConverters.getInstance()
            .resolveAsResolvedSchema(new AnnotatedType(MyClass.class));
    return openApi -> openApi
            .schema(resolvedSchema.schema.getName(), resolvedSchema.schema);
}

但是需要小心,因为如果你的附加模型没有在任何API中被引用,默认情况下SpringDoc会自动删除每一个断开的引用定义。
要禁用此默认行为,需要使用以下配置属性:

springdoc.remove-broken-reference-definitions=false
trnvg8h3

trnvg8h32#

接受的答案是正确的,但是这只会添加“MyClass.class”的模式。如果有任何从MyClass.class引用的类不在模式中,它们将不会被添加。我设法添加了所有的类,如下所示:

private OpenApiCustomiser addAdditionalModels() {
    Map<String, Schema> schemasToAdd = ModelConverters.getInstance()
        .resolveAsResolvedSchema(new AnnotatedType(MyClass.class))
        .referencedSchemas;
    return openApi -> {
      var existingSchemas = openApi.getComponents().getSchemas();
      if (!CollectionUtils.isEmpty(existingSchemas)) {
        schemasToAdd.putAll(existingSchemas);
      }
      openApi.getComponents().setSchemas(schemasToAdd);
    };
}
u91tlkcl

u91tlkcl3#

我测试了两个解决方案,并具有以下依赖项:

<dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>1.6.6</version>
    </dependency>
    <dependency>
        <groupId>io.swagger.codegen.v3</groupId>
        <artifactId>swagger-codegen-generators</artifactId>
        <version>1.0.32</version>
    </dependency>

@nkocev解决方案在重新加载/v3/api-docs时对putAll()抛出了不支持的操作异常。
异常错误:在Java.util中为空。集合$不可修改的Map。全部放置(集合. java:1465)
@VadymVL解决方案运行良好,响应模型已添加到架构中。
我只是想提供这个信息。如果你想添加多个缺失的模式,你可以为每个模式创建一个@Bean。

@Configuration
public class SampleConfiguration {

    @Bean
    public OpenApiCustomiser schemaCustomiser() {
        ResolvedSchema resolvedSchema = ModelConverters.getInstance()
                .readAllAsResolvedSchema(new AnnotatedType(MyClass.class));
        return openApi -> openApi.schema(resolvedSchema.schema.getName(), resolvedSchema.schema);
    }

    @Bean
    public OpenApiCustomiser schemaCustomiser2() {
        ResolvedSchema resolvedSchema = ModelConverters.getInstance()
                .readAllAsResolvedSchema(new AnnotatedType(MyClass2.class));
        return openApi -> openApi.schema(resolvedSchema.schema.getName(), resolvedSchema.schema);
    }
}

我刚刚开始使用这些依赖项,但这似乎是一个可行的解决方案。我期待着更多有用的POC。

zdwk9cvp

zdwk9cvp4#

使用GroupedOpenApi(必须手动设置模式):

@Bean
    GroupedOpenApi api() {
        return GroupedOpenApi.builder()
                .group("REST API")
                .addOpenApiCustomizer(openApi -> {
                    openApi.addSecurityItem(new SecurityRequirement().addList("Authorization"))
                            .components(new Components()
                                    .addSchemas("User", ModelConverters.getInstance().readAllAsResolvedSchema(User.class).schema)
                                    .addSchemas("UserTo", ModelConverters.getInstance().readAllAsResolvedSchema(UserTo.class).schema)
                                    .addSecuritySchemes("Authorization", new SecurityScheme()
                                            .in(SecurityScheme.In.HEADER)
                                            .type(SecurityScheme.Type.HTTP)
                                            .scheme("bearer")
                                            .name("JWT"))
                            )
                            .info(new Info().title("REST API").version("1.0").description(...));
                })
                .pathsToMatch("/api/**")
                .build();
    }

相关问题