如何在操作中未引用的 sprinddoc 中添加 class?
How can I add a class in sprinddoc that is not referenced from an operation?
我正在使用 springdoc
,spring-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。
我正在使用 springdoc
,spring-boot
主要配置了注释。
我想公开一个未被任何服务引用的特定 class 架构。可以这样做吗?
在伪代码中,我正在有效地尝试这样做:
GroupedOpenAPI.parseAndAddClass(Class<?> clazz);
或
GroupedOpenAPI.scan("my.models.package");
===更新===
我设法使用 ModelConverters.getInstance().readAll(MyClass.class);
然后尝试将其添加为 OpenApiCustomiser
,但它在 UI.
在 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
接受的答案是正确的,但是这只会添加“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。