gpt4 book ai didi

spring-boot - 如何配置 springfox 以解包响应类型,例如 Mono 和 Flux,而无需在 @ApiResponse 中显式指定响应类型

转载 作者:行者123 更新时间:2023-12-04 00:02:32 24 4
gpt4 key购买 nike

我正在使用 springfox 3.0.0 进行响应式支持,并且正在使用 @EnableSwagger2WebFlux在我招摇的配置上。

我的招摇配置如下:

@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(basePackage))
.paths(PathSelectors.any())
.build()
.securityContexts(Lists.newArrayList(securityContext()))
.securitySchemes(Lists.newArrayList(apiKey()))
.globalOperationParameters(operationParameters());
}

我有一个简单的 Controller ,如下所示:
  @CrossOrigin(origins = "*", allowedHeaders = "*", maxAge = 3600)
@RestController
@RequestMapping("/")
public class ApiController {

@ApiOperation(value = "get all partners", authorizations = {@Authorization(value = "Bearer")})
@RequestMapping(value = "/partner",
method = RequestMethod.GET,
produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Request succeeded")
})
public Mono<ResponseEntity<Flux<PartnerDTO>>> getAllPartners(
@ApiIgnore ServerHttpRequest httpRequest
) {
return ...
}

springfox 生成文档时,它有以下类型:
enter image description here

而这种类型在我的 API 操作中是没用的:
enter image description here

我知道我可以通过在@ApiOperation 中指定响应类型来解决这个问题,但我试图避免这种情况,例如
@ApiOperation(value = "get all partners", authorizations = {@Authorization(value = "Bearer")})
@RequestMapping(value = "/partner",
method = RequestMethod.GET,
produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Request succeeded", response = PartnerDTO.class)
})
public Mono<ResponseEntity<Flux<PartnerDTO>>> getAllPartners(
@ApiIgnore ServerHttpRequest httpRequest
) {

我不喜欢这种方法,因为它是手动过程,因此容易出错。
我想要一些自动的方法来进行以下转换:
Flux<T> -> T[] (since flux emits 0...N elements)
Mono<T> -> T
ResponseEntity<T> -> T

当然它必须是递归的(例如 Mono<ResponseEntity<Flux<T>>> -> T )。

最佳答案

我浏览了 springfox 的代码,试图找到一些自定义类型解析的入口点,幸运的是它有一个 HandlerMethodResolver可以从外部注入(inject)。

我在我的 swagger 配置类中添加了这个解析器的自定义实现:

@Bean
@Primary
public HandlerMethodResolver fluxMethodResolver(TypeResolver resolver) {
return new HandlerMethodResolver(resolver) {
@Override
public ResolvedType methodReturnType(HandlerMethod handlerMethod) {
var retType = super.methodReturnType(handlerMethod);

// we unwrap Mono, Flux, and as a bonus - ResponseEntity
while (
retType.getErasedType() == Mono.class
|| retType.getErasedType() == Flux.class
|| retType.getErasedType() == ResponseEntity.class
) {
if ( retType.getErasedType() == Flux.class ) {
// treat it as an array
var type = retType.getTypeBindings().getBoundType(0);
retType = new ResolvedArrayType(type.getErasedType(), type.getTypeBindings(), type);
} else {
retType = retType.getTypeBindings().getBoundType(0);
}
}

return retType;
}
};
}

这正是我需要的。

enter image description here

它会自动转换 Mono<ResponseEntity<Flux<PartnerDTO>>>PartnerDTO[] , 和 Mono<ResponseEntity<Mono<PartnerDTO>>>PartnerDTO .

编辑: :我改变了这个实现,将 Flux 转换为 T[],因为它应该从一开始就是。

关于spring-boot - 如何配置 springfox 以解包响应类型,例如 Mono 和 Flux,而无需在 @ApiResponse 中显式指定响应类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57736856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com