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

