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配置,直接在构造方法中添加:
若用web.xml配置,添加如下初始化参数:public App() { property("jersey.config.cdi.bean.discovery.disabled", true); register(new Binder()); }<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
相关产品推荐
相关产品推荐

