Quarkus自定义扩展中ContainerRequestFilter未生效问题求助
问题背景
计划开发一款供内部服务复用的自定义Quarkus扩展,核心功能之一是对所有入站请求实现统一拦截过滤,拦截器实现代码如下:
@Provider public class RequestInterceptor implements ContainerRequestFilter { private static final Logger logger = Logger.getLogger(RequestInterceptor.class.getName()); @Override public void filter(ContainerRequestContext requestContext) { logger.info("Testing extension interceptor"); } }
在扩展的构建处理器类中通过如下方式完成相关组件与拦截器的注册:
class LoggingExtensionProcessor { private static final Logger logger = Logger.getLogger(LoggingExtensionProcessor.class.getName()); private static final String FEATURE = "logging-extension"; @BuildStep FeatureBuildItem feature() { return new FeatureBuildItem(FEATURE); } @BuildStep ServletBuildItem createServlet() { logger.info("createServlet"); return ServletBuildItem.builder(FEATURE, GreetingExtensionServlet.class.getName()) .addMapping("/greeting") .build(); } @BuildStep AdditionalBeanBuildItem registerAdditionalBeans() { logger.info("registerAdditionalBeans"); return AdditionalBeanBuildItem.builder() .setUnremovable() .addBeanClass(RequestInterceptor.class) .build(); } @BuildStep ResteasyJaxrsProviderBuildItem registerConfiguration() { logger.info("registerConfiguration"); return new ResteasyJaxrsProviderBuildItem(RequestInterceptor.class.getName()); } }
同时在runtime模块的pom配置文件中添加Jandex maven插件,配置如下:
<plugin> <groupId>org.jboss.jandex</groupId> <artifactId>jandex-maven-plugin</artifactId> <version>1.2.2</version> <executions> <execution> <id>make-index</id> <goals> <goal>jandex</goal> </goals> </execution> </executions> </plugin>
完成上述所有配置后,请求拦截器始终未被调用执行。参考过同类场景的公开讨论,但帖中给出的解决方案无法解决当前问题,需要对应的排查思路与解决建议。
排查思路与解决方案
- 确认拦截器适配的请求类型:
ContainerRequestFilter是JAX-RS规范定义的拦截器,默认仅拦截标注了@Path的JAX-RS资源请求,不会覆盖原生Servlet、静态资源等非JAX-RS请求。你代码中注册的/greeting是原生Servlet,本身就不在JAX-RS拦截器的处理范围内,测试时访问这个路径自然不会触发拦截器。如果需要拦截所有入站HTTP请求,不要用JAX-RS Filter,换成Vert.x路由拦截器或者Servlet Filter实现即可。 - 核对Resteasy版本与注册类匹配:如果你使用的是
quarkus-resteasy-reactive依赖(Quarkus官方默认推荐的REST实现),ResteasyJaxrsProviderBuildItem完全不生效,必须替换为ResteasyReactiveJaxrsProviderBuildItem来注册JAX-RS Provider。同时要确保runtime模块已经引入了对应的Resteasy依赖,否则注册的BuildItem没有对应的扩展消费,等于无效注册。 - 移除重复注册逻辑:你同时通过
AdditionalBeanBuildItem和ResteasyJaxrsProviderBuildItem注册同一个拦截器,部分Quarkus版本会出现Bean重复定义导致的加载冲突,直接保留ResteasyJaxrsProviderBuildItem的注册逻辑即可,JAX-RS Provider会被自动注册为CDI Bean,不需要额外标记为AdditionalBean。 - 修正Jandex配置:Jandex插件必须配置在runtime模块的build/plugins节点下,不要放在deployment模块或者父pom的pluginManagement节点中,否则runtime模块的类不会生成索引,Quarkus构建时无法识别类上的注解。另外你用的1.2.2版本Jandex插件过旧,建议升级到1.4.4及以上版本适配高版本Quarkus,避免索引生成异常。
- 检查拦截器执行优先级:如果业务服务中存在其他JAX-RS拦截器,可以给自定义拦截器添加
@Priority(Priorities.AUTHENTICATION)注解指定执行优先级,避免被其他提前终止请求的拦截器跳过,导致自定义逻辑不执行。
快速验证步骤:启动应用后新增一个简单的标注了
@Path("/test")的测试接口,访问该接口查看控制台是否输出Testing extension interceptor日志。如果日志正常输出,说明拦截器注册逻辑本身没有问题,之前不生效只是因为测试请求路径不在JAX-RS拦截器的覆盖范围内。
内容的提问来源于stack exchange,提问作者Crilofer
相关产品推荐
相关产品推荐

