WebFlux返回Mono<ResponseEntity>类型不匹配问题排查
代码问题分析与修复
核心问题
类型不匹配
你直接将Mono<ViewResponse>作为ResponseEntity的body,导致ResponseEntity的泛型变成了Mono<ViewResponse>,但方法声明的返回类型是Mono<ResponseEntity<ViewResponse>>——也就是说,ResponseEntity的body必须是ViewResponse对象本身,而不是它的Mono包装体。操作符使用错误
用map处理返回Mono的操作是错误的:map会把processViewUrl返回的Mono<ViewResponse>当作一个普通元素包裹起来,最终得到Mono<ResponseEntity<Mono<ViewResponse>>>,和方法要求的返回类型完全不匹配。应该用flatMap来处理这种返回Publisher(比如Mono)的操作,它能把内层的Mono展开,合并成符合要求的流类型。
修正后的代码
@RestController @RequestMapping("/view") public class ViewController { @GetMapping(value = "/{channelId}/**") public Mono<ResponseEntity<ViewResponse>> viewObject(@PathVariable(value = "channelId") String channelId) { // 假设channelInfoset和responseHeaders是已定义的变量 return redisController.getChannelData(channelInfoset, channelId) .flatMap(response -> processViewUrl(channelId) .map(viewResponse -> new ResponseEntity<>(viewResponse, responseHeaders, HttpStatus.OK)) ); } private Mono<ViewResponse> processViewUrl(String channelId){ return Mono.just(new ViewResponse("val","temp",false)); } }
修正说明
- 替换
map为flatMap:因为processViewUrl返回Mono,flatMap可以串联两个异步操作,将内层Mono<ViewResponse>的结果展开后继续处理。 - 在
flatMap内部,先通过processViewUrl获取Mono<ViewResponse>,再用map将实际的ViewResponse对象包装成ResponseEntity,这样整个流的类型就和方法声明的Mono<ResponseEntity<ViewResponse>>完全匹配了。
内容的提问来源于stack exchange,提问作者WISHY
相关产品推荐
相关产品推荐

