spring - 如何从 Open API 3 规范全局忽略 Spring Boot 的 API?
问题描述
我已经浏览了文档:https ://springdoc.github.io/springdoc-openapi-demos/faq.html#how-can-i-ignore-some-field-of-model- ,但是文档不是很清楚,我有Spring Boot REST HATEOAS实现项目并使用Open API 3 规范而不是 Swagger。
我已经为每个端点实现了分页,但是我的行业标准如何期望内容作为复数内容。但由于这是 Pageable API 的一部分,我无法覆盖它,而是希望禁用它。有什么建议我们该怎么做?
PageEmployeeOut:
type: object
properties:
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
size:
type: integer
format: int32
content:
type: array
items:
$ref: '#/components/schemas/EmployeeOut'
number:
type: integer
format: int32
sort:
$ref: '#/components/schemas/Sort'
numberOfElements:
type: integer
format: int32
first:
type: boolean
pageable:
$ref: '#/components/schemas/Pageable'
last:
type: boolean
empty:
type: boolean
就像在 Springfox Swagger 中一样,我们可以像下面那样做,在Open API 3 (springdoc-openui)中它的等价物是什么 ?
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
.apis(RequestHandlerSelectors.basePackage("com.example"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo())
.useDefaultResponseMessages(false)
.ignoredParameterTypes(Pageable.class);
}
这是我的终点
public ResponseEntity<Page<EmployeeDto>> findEmployees(@Parameter(hidden=true) Pageable pageable) {
Page<EmployeeDto> page = employeeService.findAllEmployees(page_params, pageable);
return new ResponseEntity<>(page, HttpStatus.OK);
}
解决方案
您只需要添加您想要的类型的 OpenAPI 描述 ov 让我们支持您想要返回 EmployeeDto 而不是 Page
@ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = EmployeeDto.class)))
如果您需要在应用程序中全局替换它,您只需使用标准 ModelConverter:
@Component
public class PageSupportConverter implements ModelConverter {
@Override
public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
JavaType javaType = Json.mapper().constructType(type.getType());
if (javaType != null) {
Class<?> cls = javaType.getRawClass();
if (Page.class.isAssignableFrom(cls)) {
JavaType innerType = javaType.getBindings().getBoundType(0);
if (innerType.getBindings() != null && isResponseTypeWrapper(innerType.getRawClass())) {
type = new AnnotatedType(innerType).jsonViewAnnotation(type.getJsonViewAnnotation()).resolveAsRef(true);
return this.resolve(type, context, chain);
}
else {
type = new AnnotatedType(innerType).jsonViewAnnotation(type.getJsonViewAnnotation()).resolveAsRef(true);
}
}
}
if (chain.hasNext()) {
return chain.next().resolve(type, context, chain);
}
else {
return null;
}
}
}
推荐阅读
- optaplanner - Optaplanner 中的学校时间表(TO DO 评论)
- php - 使用php从数据库中获取多个json
- apache-superset - 如何为 Apache Superset 添加两个 TIme 列过滤器?
- .net - 为我的 Web 应用程序迁移到 Azure Linux 使内存使用量从 50mb 跃升至 300mb - 这正常吗?
- javascript - 如何在另一个元素中使用 parseFromString 脚本输出
- java - 如何在 android studio 应用程序中翻译单词?
- javascript - 如何在更改屏幕时自动滚动到顶部
- solidity - 类型错误:成员在 unit256 中未找到或可见
- networking - 使用带有完整路径的 fs.unlinkSync 删除项目中的文件,它适用于本地服务器,但在部署到 azure web 应用程序后会出现错误(5xx)
- python - 当我安装 tensorflow 时出现以下错误 ImportError: cannot import name '_set_madvise_hugepage' from 'numpy.core._multiarray_umath'