如何在操作中未引用的 sprinddoc 中添加 class?

How can I add a class in sprinddoc that is not referenced from an operation?

我正在使用 springdocspring-boot 主要配置了注释。

我想公开一个未被任何服务引用的特定 class 架构。可以这样做吗?

在伪代码中,我正在有效地尝试这样做:

GroupedOpenAPI.parseAndAddClass(Class<?> clazz);

GroupedOpenAPI.scan("my.models.package");

===更新===

我设法使用 ModelConverters.getInstance().readAll(MyClass.class);

解析了架构

然后尝试将其添加为 OpenApiCustomiser,但它在 UI.

中仍然不可见

在 SpringDoc 中,您可以使用 OpenApiCustomiser

将不相关的 class 添加到生成的规范中
@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

接受的答案是正确的,但是这只会添加“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);
    };
}

我用以下依赖项测试了这两个解决方案:

    <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 解决方案在重新加载时为 putAll() 抛出 UnsupportedOperationException /v3/api-docs。

java.lang.UnsupportedOperationException: 空 在 java.util.Collections$UnmodifiableMap.putAll(Collections.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。