SpringWebflux返回Optional<ByteArrayResource>出现Mono泛型编译报错如何解决
错误根因
该编译错误是类型不匹配导致的:response.bodyToMono(ByteArrayResource.class)返回的是Mono<ByteArrayResource>类型的响应式对象,你直接将其传入Optional.of(),会得到Optional<Mono<ByteArrayResource>>,和方法声明要返回的Optional<ByteArrayResource>类型不符,因此编译器抛出类型匹配失败的错误。同时你代码中block()的位置也存在语法错误。
修复后的实现代码
Supplier<Optional<ByteArrayResource>> requestSupplier = () -> webClient .get() .uri(URL) .accept(MediaType.APPLICATION_OCTET_STREAM) .<Optional<ByteArrayResource>>exchangeToMono(response -> { if (response.statusCode().equals(HttpStatus.NOT_FOUND)) { return Mono.just(Optional.empty()); } // 将响应体内容映射为Optional,而非把Mono对象本身塞进Optional return response.bodyToMono(ByteArrayResource.class) .map(Optional::of); }) // block放在链式调用末尾,阻塞拿到最终的Optional结果 .block();
核心修改点
- 移除了多余的
Mono.just(Optional.of(...))包装:直接对response.bodyToMono的返回结果调用map(Optional::of),将实际的ByteArrayResource实例封装为Optional,保证exchangeToMono返回的Mono<Optional<ByteArrayResource>>和泛型声明完全匹配 - 调整了
block()的位置:放在exchangeToMono链式调用的末尾,阻塞获取响应式流最终输出的Optional<ByteArrayResource>对象
内容的提问来源于stack exchange,提问作者Gustavo Oliveira
相关产品推荐
相关产品推荐

