Spring Reactive接口如何灵活返回正常结果与自定义错误提示?
解决方案
方案1:修正控制器内的错误处理逻辑
你的代码出现类型检查问题,是因为onErrorResume的lambda没有返回Mono<ResponseEntity<?>>,而是直接返回了ResponseEntity对象。同时返回错误时应传递错误消息字符串而非异常对象本身,调整后即可满足成功返回List<ProductEntity>、失败返回错误字符串的需求:
@GetMapping("/search") public Mono<ResponseEntity<?>> findProduct(@RequestBody ProductSearch productSearch) { return findProduct2(productSearch) .map(products -> ResponseEntity.ok(products)) .onErrorResume(IllegalArgumentException.class, error -> // 用Mono.just包裹ResponseEntity,同时传递错误消息字符串 Mono.just(ResponseEntity.badRequest().body(error.getMessage())) ); }
该方案无需额外全局配置或自定义返回类,完全在当前控制器方法内解决问题,类型检查可正常通过。
方案2:使用全局异常处理器(更适配团队协作的优雅方案)
若希望控制器代码更简洁,同时统一处理特定异常,可通过@ControllerAdvice定义全局异常处理器,专门捕获IllegalArgumentException并返回400响应:
@ControllerAdvice public class CustomExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) public Mono<ResponseEntity<String>> handleIllegalArgument(IllegalArgumentException ex) { return Mono.just(ResponseEntity.badRequest().body(ex.getMessage())); } }
此时控制器方法可简化为直接返回业务数据,Spring会自动处理成功场景的响应包装:
@GetMapping("/search") public Mono<List<ProductEntity>> findProduct(@RequestBody ProductSearch productSearch) { return findProduct2(productSearch); }
这个方案的优势:
- 控制器代码专注业务逻辑,无需混入错误处理代码
- 仅针对
IllegalArgumentException返回自定义400响应,其他异常仍按Spring默认逻辑处理,不会泄露敏感信息 - 团队内可统一这类特定异常的处理规则,无需每个控制器重复编写错误逻辑
内容的提问来源于stack exchange,提问作者dxgamer2001
相关产品推荐
相关产品推荐

