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

如何在Quarkus的ContainerResponseContext中获取Throwable?

在Quarkus Resteasy-Reactive的ContainerResponseFilter中获取原始异常

方案一:使用Resteasy Reactive内部API直接获取

你可以通过ResteasyReactiveRequestContext.getCurrent()获取当前请求上下文,进而调用getThrowable()拿到服务抛出的原始异常。示例代码如下:

import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.ext.Provider;
import org.jboss.resteasy.reactive.common.core.ResteasyReactiveRequestContext;

@Provider
public class ExceptionCapturingResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
        ResteasyReactiveRequestContext reactiveCtx = ResteasyReactiveRequestContext.getCurrent();
        Throwable originalException = reactiveCtx.getThrowable();
        
        if (originalException != null) {
            // 在这里处理捕获到的异常
        }
    }
}

注意:该方式依赖Resteasy Reactive的内部API,虽然在Quarkus 2.16.4.Final中可用,但后续版本可能存在变动风险。

方案二:通过ExceptionMapper中转存储(标准API方式)

如果不想依赖内部API,可借助全局ExceptionMapper将异常存入请求属性,再在ContainerResponseFilter中读取:

  1. 实现全局ExceptionMapper:
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.Request;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;

@Provider
public class GlobalExceptionStorer implements ExceptionMapper<Throwable> {

    @Context
    private Request request;

    @Override
    public Response toResponse(Throwable throwable) {
        // 将异常存入请求属性
        request.setAttribute("original_service_exception", throwable);
        // 返回默认错误响应,或交由其他ExceptionMapper处理
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                .entity("服务内部错误")
                .build();
    }
}
  1. 在ContainerResponseFilter中读取异常:
import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.ext.Provider;

@Provider
public class ExceptionCapturingResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
        Throwable originalException = (Throwable) requestContext.getProperty("original_service_exception");
        
        if (originalException != null) {
            // 处理捕获到的异常
        }
    }
}

该方式基于标准JAX-RS API,兼容性更强,无内部API依赖风险。

关于特性请求

若上述方案均无法满足你的需求,或希望Quarkus提供标准API来直接获取原始异常,可前往Quarkus官方GitHub仓库提交特性请求,清晰描述你的使用场景与需求。

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:13:13