如何将Mono<Response>转为Mono<RequestID>并构建Mono<ResponseEntity>
解决方案
1. 转换Mono<Response>为Mono<RequestID>
修改sendFile方法,利用Reactor的map操作符从Response对象中提取RequestID,同时修正方法的返回值类型:
public Mono<RequestID> sendFile(final MultipartFile multipartFile) { // 确保multiValueMap已正确构建,包含上传文件的内容 Mono<Response> responseMono = webClient.post() .uri("someurl") // 直接传入字符串即可,WebClient会自动处理URI转换 .body(BodyInserters.fromMultipartData(multiValueMap)) .retrieve() .bodyToMono(Response.class); // 通过map操作符完成响应对象的转换 return responseMono.map(Response::getRequestID); }
2. 控制器中构建响应式Mono<ResponseEntity>
控制器中不能直接从Mono<RequestID>同步取值(违反响应式非阻塞原则),需通过响应式操作符链式处理:
@PostMapping("/request") public Mono<ResponseEntity<Response2<String>>> sendRequest(@RequestPart(value = "file") final MultipartFile multipartFile) { return service.sendFile(multipartFile) // 将RequestID转换为自定义Response2对象 .map(requestID -> new Response2<>(requestID.getRequestID(), true, "SUCCESS")) // 包装为ResponseEntity并指定HTTP状态码 .map(response2 -> ResponseEntity.status(HttpStatus.CREATED).body(response2)); }
关键注意点
- 响应式类型(如
Mono)的值是异步发射的,禁止直接调用request.getRequestID()这类同步方法,必须通过map/flatMap等操作符处理异步流。 - 确保
Response类提供getRequestID()getter方法,RequestID类提供getRequestID()getter方法,否则无法完成映射逻辑。
内容的提问来源于stack exchange,提问作者user21476047
相关产品推荐
相关产品推荐

