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

Quarkus开发模式下JAX-RS抛出异常时ExceptionMapper未触发问题

解决Quarkus开发模式下自定义ExceptionMapper未捕获JAX-RS内置异常的问题

这个问题的核心原因是Quarkus在开发模式下默认注册了针对JAX-RS内置异常(如NotFoundException)的专用ExceptionMapper,这些内置映射器的匹配优先级比你的RuntimeException通用映射器更高,所以会优先处理子类异常,导致你的自定义映射器未被触发。而生产模式下,这些用于调试的内置映射器会被自动禁用,因此你的代码能正常工作。

以下是两种可行的解决思路:

方法一:禁用默认异常映射器

在application.properties中添加配置,关闭Quarkus默认的异常映射器:

quarkus.resteasy.disable-default-exception-mappers=true

这样所有未被自定义映射器处理的RuntimeException(包括其子类)都会被你的BaseRuntimeExceptionMapper捕获。

方法二:提高自定义映射器的优先级

如果你不想完全禁用默认映射器,可以给你的自定义映射器添加@Priority注解,让它的优先级高于内置映射器:

@Provider
@Priority(Priorities.USER) // USER优先级高于默认的内置映射器
public class BaseRuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {

    @Override
    public Response toResponse(RuntimeException e) {
        return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
    }
}

Priorities.USER是JAX-RS定义的用户级优先级,数值为5000,而Quarkus内置的异常映射器通常使用更低的优先级(更高的数值),所以这个注解会让你的映射器优先被选中。

测试时,重启开发模式后抛出NotFoundException,应该就能触发你的自定义映射器返回500状态码了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:20:31