Quarkus Mutiny REST Client自定义ExceptionMapper异常处理失效问题
问题原因及解决方案
初始问题(无法触发Uni的失败事件)
你最初没有拿到失败事件的核心原因就是缺失quarkus-rest-client-mutiny依赖,添加该依赖的操作是正确的,添加后才能将Rest Client的异常转为Mutiny的Uni失败事件。
异常被包装为ResteasyWebApplicationException的问题
这个问题是自定义ResponseExceptionMapper优先级不足导致的,按以下步骤修改即可生效:
确认实现的是客户端专用的异常Mapper接口
你实现的必须是org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper<T>,不要误用JAX-RS服务端的javax.ws.rs.ext.ExceptionMapper,后者仅在服务端响应处理链生效。给自定义Mapper添加高优先级注解
Quarkus Rest Client默认的DefaultResponseExceptionMapper优先级为5000,优先级数值越小执行顺序越靠前。你需要给自定义Mapper设置小于5000的优先级,才能优先执行你的异常转换逻辑,避免走默认的异常包装逻辑:
import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper; import javax.annotation.Priority; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; @Priority(1000) // 优先级高于默认Mapper public class MyExceptionMapper implements ResponseExceptionMapper<MyException> { // 可选:重写handles方法,只处理你需要的状态码范围 @Override public boolean handles(int status, MultivaluedMap<String, Object> headers) { return status >= 400; // 仅处理4XX、5XX类错误 } @Override public MyException toThrowable(Response response) { // 示例:从响应中提取状态码、错误信息构造自定义异常 int status = response.getStatus(); String errorMsg = response.readEntity(String.class); return new MyException(status, errorMsg); } }
- 确认自定义异常为非受检异常
你的MyException需要继承RuntimeException,Mutiny的失败事件仅支持非受检异常,受检异常会被框架自动包装为运行时异常。
修改完成后,你就能在onFailure()回调中直接拿到你自定义的MyException实例。
内容的提问来源于stack exchange,提问作者Michele Bortolato
相关产品推荐
相关产品推荐

