Quarkus中@ServerResponseFilter仅首次生效GET请求不触发问题排查
问题原因与解决方案
根本原因
你遇到的@ServerResponseFilter仅首次生效的问题,通常属于以下几种场景:
- 第二次请求未进入JAX-RS处理链路:
@ServerResponseFilter是JAX-RS规范下的过滤器,仅对匹配到JAX-RS资源(即@Path注解类下的接口)的请求生效。如果你的GET请求属于静态资源、被缓存扩展直接返回、被其他Vert.x路由提前处理,就不会触发该过滤器。 - 缓存逻辑跳过拦截链:如果你的接口添加了
@CacheResult等缓存注解,第二次请求会直接返回缓存的响应对象,不会走完整的JAX-RS过滤器链,导致头没有被添加。 - 过滤器执行异常静默失败:你贴出的代码存在两处语法问题:
responseBasicHeaderFilter方法里putSingle("myHeader, "myValue")的key少了闭合双引号responseLoggingFilter方法里参数列表多了一个连续逗号
如果实际代码也存在类似问题,首次执行后可能导致Bean状态异常,后续调用被静默跳过。
- 头被后续逻辑覆盖:如果有更高优先级的过滤器、异常映射器或者Quarkus内置的头处理逻辑,会把你添加的
myHeader覆盖或清除。
解决方案
方案1(推荐:全局生效无遗漏)
改用Vert.x层的全局路由过滤器,会对所有进入Quarkus的HTTP请求生效,不受JAX-RS链路、缓存、静态资源的限制:
import io.vertx.ext.web.RoutingContext; import io.quarkus.vertx.web.RouteFilter; import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class GlobalHeaderFilter { @RouteFilter void addMyHeader(RoutingContext rc) { rc.response().putHeader("myHeader", "myValue"); rc.next(); } }
方案2(继续使用JAX-RS过滤器)
如果仅需要对JAX-RS资源的请求加头,做以下调整:
- 给响应过滤器添加优先级注解,确保头修改逻辑优先执行,不会被覆盖:
import javax.ws.rs.Priorities; import javax.annotation.Priority; @Priority(Priorities.HEADER_DECORATOR) @ServerResponseFilter public void responseBasicHeaderFilter(ContainerResponseContext responseContext) { responseContext.getHeaders().putSingle("myHeader", "myValue"); }
- 排查所有需要加头的接口是否都是JAX-RS资源,确认没有缓存配置跳过过滤器链。
- 修复过滤器代码的语法错误,添加异常捕获打印日志,避免静默失败。
内容的提问来源于stack exchange,提问作者mangusbrother
相关产品推荐
相关产品推荐

