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

Quarkus中@ServerResponseFilter仅首次生效GET请求不触发问题排查

问题原因与解决方案

根本原因

你遇到的@ServerResponseFilter仅首次生效的问题,通常属于以下几种场景:

  • 第二次请求未进入JAX-RS处理链路:@ServerResponseFilter是JAX-RS规范下的过滤器,仅对匹配到JAX-RS资源(即@Path注解类下的接口)的请求生效。如果你的GET请求属于静态资源、被缓存扩展直接返回、被其他Vert.x路由提前处理,就不会触发该过滤器。
  • 缓存逻辑跳过拦截链:如果你的接口添加了@CacheResult等缓存注解,第二次请求会直接返回缓存的响应对象,不会走完整的JAX-RS过滤器链,导致头没有被添加。
  • 过滤器执行异常静默失败:你贴出的代码存在两处语法问题:
    1. responseBasicHeaderFilter方法里putSingle("myHeader, "myValue")的key少了闭合双引号
    2. 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资源的请求加头,做以下调整:

  1. 给响应过滤器添加优先级注解,确保头修改逻辑优先执行,不会被覆盖:
import javax.ws.rs.Priorities;
import javax.annotation.Priority;

@Priority(Priorities.HEADER_DECORATOR)
@ServerResponseFilter
public void responseBasicHeaderFilter(ContainerResponseContext responseContext) {
    responseContext.getHeaders().putSingle("myHeader", "myValue");
}
  1. 排查所有需要加头的接口是否都是JAX-RS资源,确认没有缓存配置跳过过滤器链。
  2. 修复过滤器代码的语法错误,添加异常捕获打印日志,避免静默失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:06:02