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

Jersey 2.25.1升级到2.32后AbstractBinder失效抛出空指针异常

问题根因

Jersey从2.26版本开始重构了内部注入层,原有HK2绑定逻辑和CDI的集成逻辑发生了变化,你遇到的NPE是自定义的Model类没有被Jersey识别为合法的@Context注入类型,导致ContextInjectionResolver处理时出现空指针。

可行解决步骤
  • 修改Binder绑定逻辑,2.32版本中bindFactory需要显式声明类型为@Context可注入类型,新增bindAsContract()配置:
@Override
protected void configure() {
    bindFactory(ModelFactory.class)
    .to(Model.class)
    .proxy(true)
    .proxyForSameScope(false)
    .in(RequestScoped.class)
    .bindAsContract();
}
  • 移除ModelFactory上的@Provider注解,Supplier是由Binder直接管理的,不需要标注为Jersey Provider,避免被WebLogic自带的Weld CDI容器重复扫描实例化,导致内部@Context注入的HttpServletRequest为空。
  • 如果项目引入了jersey-cdi1x相关依赖,需要显式配置禁用CDI对Jersey Bean的扫描,优先走Jersey自身的注入逻辑:
    若用ResourceConfig配置,直接在构造方法中添加:
    public App() {
        property("jersey.config.cdi.bean.discovery.disabled", true);
        register(new Binder());
    }
    
    若用web.xml配置,添加如下初始化参数:
    <init-param>
      <param-name>jersey.config.cdi.bean.discovery.disabled</param-name>
      <param-value>true</param-value>
    </init-param>
    
  • 如果调整后仍报错,将Service类中注入Model的@Context注解替换为javax.inject.Inject注解即可。
验证提示

修改完成后可在ModelFactory的get()方法中添加日志,判断HttpServletRequest是否为空,如果request仍为空,可直接通过javax.servlet.http.HttpServletRequest的静态上下文获取,或者使用Jersey内置的RequestContext获取当前请求参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:36:03