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
相关产品推荐
相关产品推荐

