AbstractBinder not working after upgrading jersey 2.25.1 2.32

609 Views Asked by At

After upgrading jersey version abstract binder not working. I change factory to supplier, and AbstractBinder is imported from jersey internal. But the problem was not solved.

I'm getting NullPointerException when try to use the service which DI works.

java.lang.NullPointerException: org.glassfish.jersey.internal.inject.ContextInjectionResolver.compute

Registering the binder:

public class App extends ResourceConfig {
    public App() {
        register(new Binder());
    }
}

Binder:

 import org.glassfish.jersey.internal.inject.AbstractBinder; 
 import org.glassfish.jersey.process.internal.RequestScoped;  
 public class Binder extends AbstractBinder{

     @Override
     protected void configure() {
         bindFactory(ModelFactory.class)
        .proxy(true)
        .proxyForSameScope(false)
        .to(Model.class)
        .in(RequestScoped.class);
     }
 }

Supplier:

@Provider
public class ModelFactory implements Supplier<Model> {

    @Context
    HttpServletRequest request;

    @Override
    public Model get() {
        Model model = new Model();
        model.setHeaderParam(request.getHeader("key"));
        return model;
     }
}

DI usage:

public Service {

    @Context
    Model model;
}

Have any idea?

WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 1
java.lang.NullPointerException
            at org.glassfish.jersey.internal.inject.ContextInjectionResolver$3.compute(ContextInjectionResolver.java:190)
            at org.glassfish.jersey.internal.inject.ContextInjectionResolver$3.compute(ContextInjectionResolver.java:182)
            at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
            at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
            at org.glassfish.jersey.internal.inject.ContextInjectionResolver.resolve(ContextInjectionResolver.java:115)
            at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:946)
            at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:981)
            at org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider$Hk2InjectedCdiTarget.inject(CdiComponentProvider.java:908)
            at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:159)
            at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
            at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:101)
            at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
            at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:761)
            at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:784)
            at org.glassfish.jersey.ext.cdi1x.internal.CdiUtil.getBeanReference(CdiUtil.java:150)
            at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanHk2Factory$1.getInstance(AbstractCdiBeanHk2Factory.java:123)
            at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanHk2Factory._provide(AbstractCdiBeanHk2Factory.java:91)
            at org.glassfish.jersey.ext.cdi1x.internal.RequestScopedCdiBeanHk2Factory.provide(RequestScopedCdiBeanHk2Factory.java:67)
            at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:153)
            at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
            at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70)
            at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2072)
            at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:767)
            at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:706)
            at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:169)
            at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:284)
            at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:74)
            at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:109)
            at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
            at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
            at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
            at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112)
            at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:92)
            at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:61)
            at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
            at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:301)
            at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
            at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
            at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
            at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
            at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
            at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
            at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292)
            at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
            at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:460)
            at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
            at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334)
            at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
            at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286)
            at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260)
            at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137)
            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350)
            at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
            at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
            at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32)
            at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
            at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3654)
            at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3620)
            at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)
            at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:196)
            at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
            at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)
            at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2423)
            at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2280)
            at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2258)
            at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1626)
            at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1586)
            at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:270)
            at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
            at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
            at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
            at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
            at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:617)
            at weblogic.work.ExecuteThread.execute(ExecuteThread.java:397)
            at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)
1

There are 1 best solutions below

0
JCompetence On

You will need to use @Inject instead of @Context.

Example of Usage:

public class AuthenticatedDriveFactory implements Supplier<AuthenticatedDrive> {


   @Inject
   private DFMSClient client;

   @Override
   public AuthenticatedDrive get() {

      return new AuthenticatedDrive(client.createDriveServices());
   }

  }

   public class Binder extends AbstractBinder {
      @Override
      protected void configure() {
         bindFactory(AuthenticatedDriveFactory.class).to(AuthenticatedDrive.class).in(Singleton.class);
      }
   }

@Path("/drive")
public class DriveResource extends DriveApi {

   @Context
   private HttpServletRequest httpRequest;

   @Inject
   private AuthenticatedDrive drive;   <-- Use @Inject instead of @Context

}