OK - I have a workaround. You need to create a wrapper class that acts as the 
context resolver:

@Provider
public class MyResolver implements 
ContextResolver<DiscoveryContext<ServicePayload>>
{
    private final GenericDiscoveryContext<ServicePayload> context;

    public MyResolver(GenericDiscoveryContext<ServicePayload> context)
    {
        this.context = context;
    }

    @Override
    public DiscoveryContext<ServicePayload> getContext(Class<?> type)
    {
        return context;
    }
}

In the Singletons, instead of adding discoveryContext, add:

        new MyResolver(discoveryContext)

In my tests, this fixed the problem.

-Jordan

On Jul 19, 2013, at 5:01 PM, [email protected] wrote:

> Hello,
>  
> I am using Curator’s curator-x-discovery-sever and trying to set it up with 
> Jersey and Tomcat.
>  
> I created my resource class, injected the class. Also injected those 
> singletons mentioned.
> (following this page 
> http://curator.incubator.apache.org/curator-x-discovery-server/index.html )
>  
> However, I am getting NPE when the contextResolver tries to getContext.
>  
> The ContextResolver singleton is injected, and it looks like the @Context 
> injection isn’t happening.
>  
> Can someone please help me to see what is wrong with my code?
>  
> Thanks.
>  
> Here is my code, the highlighted line is where the exception happens:
>  
> Resource
>  
> @Path("compass")
> public class CompassResource extends DiscoveryResource<ServicePayload>
> {
>     public CompassResource(@Context 
> ContextResolver<DiscoveryContext<ServicePayload>> resolver)
>     {
>         super(resolver.getContext(DiscoveryContext.class));
>     }
> }
>  
> Application
>  
> public class DiscoveryServerApplication extends Application
> {
>     @Override
>     public Set<Class<?>> getClasses() {
>         Set<Class<?>> s = new HashSet<Class<?>>();
>         //s.add(MyResource.class);
>         s.add(CompassResource.class);
>         return s;
>     }
>  
>     @Override
>     public Set<Object> getSingletons() {
>         final Set<Object> singletons = Sets.newHashSet();
>  
>         // inject ServiceDiscovery singleton
>         CuratorFrameworkFactory.Builder builder = 
> CuratorFrameworkFactory.builder()
>                 
> .connectString("localhost:2181").sessionTimeoutMs(300000).connectionTimeoutMs(30000)
>                 .retryPolicy(new ExponentialBackoffRetry(1000,3));
>         CuratorFramework client = builder.build();
>         client.start();
>  
>         ServiceDiscovery<ServicePayload> serviceDiscovery = 
> ServiceDiscoveryBuilder.builder(ServicePayload.class)
>                 .client(client).basePath("/").build();
>         singletons.add(serviceDiscovery);
>  
>         // inject DiscoveryContext singleton
>         GenericDiscoveryContext<ServicePayload> discoveryContext = new 
> GenericDiscoveryContext<ServicePayload>
>                 (serviceDiscovery, new RandomStrategy<ServicePayload>(), 500, 
> ServicePayload.class);
>         singletons.add(discoveryContext);
>  
>         // inject JsonServiceInstanceMarshaller singleton
>         singletons.add(new JsonServiceInstanceMarshaller(discoveryContext));
>  
>         // inject JsonServiceInstancesMarshaller singleton
>         singletons.add(new JsonServiceInstancesMarshaller(discoveryContext));
>  
>         // inject JsonServiceNamesMarshaller
>         singletons.add(new JsonServiceNamesMarshaller());
>  
>         return singletons;
>     }
> }
> web.xml
>  
>     <servlet>
>         <servlet-name>Curator Discovery Server</servlet-name>
>         
> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
>         <init-param>
>             <param-name>javax.ws.rs.Application</param-name>
>             
> <param-value>com.lb.eqr.discovery.server.DiscoveryServerApplication</param-value>
>         </init-param>
>         <load-on-startup>1</load-on-startup>
>     </servlet>
>     <servlet-mapping>
>         <servlet-name>Curator Discovery Server</servlet-name>
>         <url-pattern>/*</url-pattern>
>     </servlet-mapping>
>  
> ===========
>  
> Here is the exception:
>  
> root cause
> java.lang.NullPointerException
>         
> com.lb.eqr.discovery.server.CompassResource.<init>(CompassResource.java:23)
>         sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>         
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>         
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>         java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>         
> org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1091)
>         org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:244)
>         org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:319)
>         
> org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:448)
>         
> org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:157)
>         org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2203)
>         
> org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:579)
>         
> org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:566)
>         
> org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172)
>         
> org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:185)
>         
> org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:105)
>         
> org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:118)
>         
> org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
>         
> org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
>         
> org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
>         
> org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
>         
> org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:102)
>         
> org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:62)
>         org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
>         
> org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:215)
>         org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
>         org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
>         org.glassfish.jersey.internal.Errors.process(Errors.java:315)
>         org.glassfish.jersey.internal.Errors.process(Errors.java:297)
>         org.glassfish.jersey.internal.Errors.process(Errors.java:267)
>         
> org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
>         
> org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198)
>         
> org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946)
>         
> org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323)
>         
> org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)
>         
> org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
>         
> org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
>  
>  
> _______________________________________________
> 
> This message is for information purposes only, it is not a recommendation, 
> advice, offer or solicitation to buy or sell a product or service nor an 
> official confirmation of any transaction. It is directed at persons who are 
> professionals and is not intended for retail customer use. Intended for 
> recipient only. This message is subject to the terms at: 
> www.barclays.com/emaildisclaimer.
> 
> For important disclosures, please see: 
> www.barclays.com/salesandtradingdisclaimer regarding market commentary from 
> Barclays Sales and/or Trading, who are active market participants; and in 
> respect of Barclays Research, including disclosures relating to specific 
> issuers, please see http://publicresearch.barclays.com.
> 
> _______________________________________________
> 

Reply via email to