Couldn't agree more! That totally makes sense. Though I'm surprised this hasn't been fixed …
Thanks Jordan. I'll test it out. And confirm later. On Jul 20, 2013, at 5:26 PM, Jordan Zimmerman <[email protected]> wrote: > BTW - how many thousands of man years have been lost to erasure?!! What a > horrible mistake that decision was. > > -JZ > > On Jul 20, 2013, at 2:24 PM, Jordan Zimmerman <[email protected]> > wrote: > >> 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. >>> >>> _______________________________________________ >>> >> >
