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

Quarkus Mutiny REST Client自定义ExceptionMapper异常处理失效问题

问题原因及解决方案

初始问题(无法触发Uni的失败事件)

你最初没有拿到失败事件的核心原因就是缺失quarkus-rest-client-mutiny依赖,添加该依赖的操作是正确的,添加后才能将Rest Client的异常转为Mutiny的Uni失败事件。

异常被包装为ResteasyWebApplicationException的问题

这个问题是自定义ResponseExceptionMapper优先级不足导致的,按以下步骤修改即可生效:

  1. 确认实现的是客户端专用的异常Mapper接口
    你实现的必须是org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper<T>,不要误用JAX-RS服务端的javax.ws.rs.ext.ExceptionMapper,后者仅在服务端响应处理链生效。

  2. 给自定义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);
  }
}
  1. 确认自定义异常为非受检异常
    你的MyException需要继承RuntimeException,Mutiny的失败事件仅支持非受检异常,受检异常会被框架自动包装为运行时异常。

修改完成后,你就能在onFailure()回调中直接拿到你自定义的MyException实例。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:15:06