You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:07:42