You need to enable JavaScript to run this app. jersey-grizzly-connector下Jax-rs读写拦截器注册不生效问题
优惠活动
大模型
产品
解决方案
定价
更多

jersey-grizzly-connector下Jax-rs读写拦截器注册不生效问题

问题原因及解决方法

核心原因

  • Grizzly 连接器默认使用流式实体处理模式,该模式下会直接处理响应流,绕过 JAX-RS 标准的 ReaderInterceptor 拦截器链,仅缓冲模式下会触发拦截器执行
  • 自定义拦截器未加 @Provider 注解,部分 Jersey 版本客户端注册时可能无法正确识别拦截器类型
  • 若请求未读取响应实体(如未调用 response.readEntity() 方法、响应为204/HEAD无实体场景),ReaderInterceptor 本身就不会触发

修复步骤

1. 新增实体缓冲配置

修改客户端配置,显式指定实体处理模式为缓冲:

import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.EntityProcessingMode;

ClientConfig clientConfig = new ClientConfig();
// 开启缓冲模式触发拦截器链
clientConfig.property(ClientProperties.ENTITY_PROCESSING, EntityProcessingMode.BUFFERED);
clientConfig.register(MyInterceptor.class);
clientConfig.connectorProvider(new GrizzlyConnectorProvider());
Client client = ClientBuilder.newClient(clientConfig);

如果需要显式指定注册类型避免识别错误,也可以把注册逻辑改成:

clientConfig.register(MyInterceptor.class, ReaderInterceptor.class);

2. 给拦截器补全@Provider注解

import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
import java.io.IOException;
import javax.ws.rs.WebApplicationException;

@Provider
public class MyInterceptor implements ReaderInterceptor {
    @Override
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
        System.out.println("here i am");
        return context.proceed();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 12:27:04