Micronaut 3 集成 Project Reactor 时全局异常处理器无法调用问题
问题根因
Micronaut 3.x版本对不同响应式实现的异常处理逻辑做了拆分,原有适配RxJava3的同步异常处理器,默认不会捕获Reactor流内抛出的自定义异常,核心原因有两个:
- 缺少Reactor适配依赖,Micronaut路由层无法正确识别Reactor流内的错误信号
- 原有异常处理器优先级低于系统默认的Reactor异常处理器,自定义逻辑被覆盖
解决方案
步骤1:添加Reactor官方适配依赖
Gradle配置:
implementation("io.micronaut.reactor:micronaut-reactor")
Maven配置:
<dependency> <groupId>io.micronaut.reactor</groupId> <artifactId>micronaut-reactor</artifactId> </dependency>
该依赖会自动注册Reactor类型的信号处理器,把流内错误转发到全局异常处理链。
步骤2:调整自定义异常处理器优先级
给GlobalExceptionHandler添加最高优先级注解,避免被系统默认处理器覆盖,修正后代码如下:
import io.micronaut.core.annotation.Order; import io.micronaut.core.order.Ordered; @Produces @Singleton @Order(Ordered.HIGHEST_PRECEDENCE) @Requires(classes = {GlobalException.class, ExceptionHandler.class}) public class GlobalExceptionHandler implements ExceptionHandler<GlobalException, HttpResponse> { private static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class); @Override public HttpResponse handle(HttpRequest request, GlobalException exception) { LOG.error(exception.getLocalizedMessage()); LOG.error(exception.getCause().getMessage()); Arrays.stream(exception.getStackTrace()).forEach(item -> LOG.error(item.toString())); return HttpResponse.serverError(exception.getLocalizedMessage()); } }
提示:请确保
GlobalExceptionHandler所在的包在Micronaut的组件扫描路径下,通常放在启动类同级或者子包即可被自动识别。
可选:异常触发逻辑校验
如果调整后仍不生效,可在onErrorMap中添加日志,确认异常转换逻辑正常执行:
@Override public Flux<FindProductCommand> get(ProductSearchCriteriaCommand searchCriteria) { LOG.info("Controller --> Finding all the products"); return iProductManager.find(searchCriteria).onErrorMap(throwable -> { LOG.info("触发异常转换,原异常类型:{}", throwable.getClass().getName()); return new GlobalException(throwable); }); }
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

