如何在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中读取:
- 实现全局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(); } }
- 在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
相关产品推荐
相关产品推荐

