Thanks for your reply. I found a bug in the annotation scanning processing, I fixed it.
Thanks & Best Regards Austin ( 周?杰/Yun Jie Zhou) z/OS System Test and Performance, China System & Technology Lab Tel: 86-10-82452455 Ext: 52455 Mobile: 13811310391 E-Mail: [email protected] From: Jean-Louis Monteiro <[email protected]> To: [email protected] Cc: Jesse L Farinacci <[email protected]> Date: 08/05/2015 10:15 PM Subject: Re: Problem with override getClasses() and getSingletons() in subclass javax.ws.rs.core.Application Hi, Do you mind creating a small example to reproduce and share it on Github or so? Thanks JLouis -- Jean-Louis Monteiro http://twitter.com/jlouismonteiro http://www.tomitribe.com On Wed, Aug 5, 2015 at 1:37 AM, Yun Jie Zhou <[email protected]> wrote: > > Dear All, > > We use annotation scanning to discover Resouce classes defined in our > application and override the getClasses() with it (we add self-defined > annotation @DiscoerableResource to our Resource classes ). > At meantime, we want to override getSingletons() to customize a JSON > provider. Then we got > org.apache.cxf.service.factory.ServiceConstructionException, refer > exception trace. > > If we don't override getSingletons() only override the getClasses(), the > scanning method works fine. And the normal way of override getClasses() > (just add Resource.class to a Set) can work fine with the getSingletons() > overriding. > Anyone who know the reason why annotation scanning getClasses() cannot > coexist with getSingletons() overriding? thanks. > > Code snippet: > @Override > public Set<Class<?>> getClasses() > { > final Set<Class<?>> discoverableResources = new HashSet<Class<?>>(); > > try > { > final AnnotationDB db = new AnnotationDB(); > db.scanArchives(ClasspathUrlFinder.findClassPaths(packageName)); > > final Set<String> discoverableResourceClasses = db.getAnnotationIndex > () > .get(DiscoverableResource.class.getName()); > > if (discoverableResourceClasses != null) > { > for (final String discoverableResource : > discoverableResourceClasses) > { > try > { > if (LOG.isLoggable(Level.FINE)) > { > LOG.fine("Adding " + discoverableResource); > } > > discoverableResources.add(classLoader > .loadClass(discoverableResource)); > } > > catch (final ClassNotFoundException e) > { > LOG.warning(e.getMessage()); > if (LOG.isLoggable(Level.INFO)) > { > LOG.log(Level.INFO, e.getMessage(), e); > } > } > } > } > } > > catch (final IOException e) > { > LOG.warning(e.getMessage()); > if (LOG.isLoggable(Level.INFO)) > { > LOG.log(Level.INFO, e.getMessage(), e); > } > } > > return discoverableResources; > } > > @Override > public Set<Object> getSingletons() > { > return Collections.singleton((Object) new JacksonJsonProvider( > new ObjectMapper())); > } > > > Exception stacktrace: > Aug 05, 2015 3:51:24 PM org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean > checkResources > SEVERE: No resource classes found > Aug 05, 2015 3:51:24 PM org.apache.openejb.observer.ObserverManager > $MethodInvocation invoke > SEVERE: error invoking > org.apache.tomee.webservices.TomeeJaxRsService@c86d0239 > org.apache.cxf.service.factory.ServiceConstructionException > at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create > (JAXRSServerFactoryBean.java:194) > at > org.apache.openejb.server.cxf.rs.CxfRsHttpListener.deployApplication > (CxfRsHttpListener.java:441) > at org.apache.openejb.server.rest.RESTService.deployApplication > (RESTService.java:463) > at > org.apache.openejb.server.rest.RESTService.afterApplicationCreated > (RESTService.java:233) > at > org.apache.tomee.webservices.TomeeJaxRsService.afterApplicationCreated > (TomeeJaxRsService.java:53) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke > (NativeMethodAccessorImpl.java:76) > at sun.reflect.DelegatingMethodAccessorImpl.invoke > (DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:607) > at org.apache.openejb.observer.ObserverManager > $MethodInvocation.invoke(ObserverManager.java:399) > at > org.apache.openejb.observer.ObserverManager$InvocationList.invoke > (ObserverManager.java:514) > at org.apache.openejb.observer.ObserverManager.doFire > (ObserverManager.java:110) > at org.apache.openejb.observer.ObserverManager.fireEvent > (ObserverManager.java:99) > at org.apache.openejb.loader.SystemInstance.fireEvent > (SystemInstance.java:134) > at org.apache.tomee.catalina.TomcatWebAppBuilder.afterStart > (TomcatWebAppBuilder.java:1651) > at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent > (GlobalListenerSupport.java:116) > at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent > (LifecycleSupport.java:117) > at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent > (LifecycleBase.java:90) > at org.apache.catalina.util.LifecycleBase.setStateInternal > (LifecycleBase.java:402) > at org.apache.catalina.util.LifecycleBase.start > (LifecycleBase.java:168) > at org.apache.catalina.core.ContainerBase.addChildInternal > (ContainerBase.java:901) > at org.apache.catalina.core.ContainerBase.addChild > (ContainerBase.java:877) > at org.apache.catalina.core.StandardHost.addChild > (StandardHost.java:649) > at org.apache.catalina.startup.HostConfig.deployWAR > (HostConfig.java:1083) > at org.apache.catalina.startup.HostConfig$DeployWar.run > (HostConfig.java:1880) > at java.util.concurrent.Executors$RunnableAdapter.call > (Executors.java:471) > at > java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) > at java.util.concurrent.FutureTask.run(FutureTask.java:166) > at java.util.concurrent.ThreadPoolExecutor.runWorker > (ThreadPoolExecutor.java:1145) > at java.util.concurrent.ThreadPoolExecutor$Worker.run > (ThreadPoolExecutor.java:615) > at java.lang.Thread.run(Thread.java:781) > Caused by: javax.ws.rs.WebApplicationException > at org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean.checkResources > (AbstractJAXRSFactoryBean.java:315) > at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create > (JAXRSServerFactoryBean.java:144) > ... 30 more > > Thanks & Best Regards > > Austin ( 周?杰/Yun Jie Zhou) > z/OS System Test and Performance, China System & Technology Lab > Tel: 86-10-82452455 Ext: 52455 > Mobile: 13811310391 > E-Mail: [email protected]
