users@jersey.java.net

[Jersey] Re: Spring's _at_Autowired field not being set within root resource class

From: Farrukh Najmi <farrukh_at_wellfleetsoftware.com>
Date: Mon, 03 Oct 2011 16:52:42 -0400

I am still having some problems with an @Autowired field not being set
under the following scenario in my junit test. The scenario is as follows:

    * Test create a spring context using
      org.springframework.test.context.ContextConfiguration annotation
    * Test starts a org.glassfish.grizzly.http.server.HttpServer and
      deploys a
      com.sun.jersey.spi.spring.container.servlet.SpringServlet
      following example posted here:
      http://blogs.oracle.com/enterprisetechtips/entry/jersey_and_spring#modres
    * The servlet config specifies multiple packages to scan using
      initParam "com.sun.jersey.config.property.packages"
    * The packages to scan includes 2 jersey top level resource classes
      with different root Paths
    * Test then invokes POST method to servlet which is handled by
      myPackage.MyResource1. The POST method invokes the same servlet
      with a different path that is handled by the second jersey
      resource class myPackage.MyResource2.
    * It is observed that the first class myPackage.MyResource1 has
      @Autowired fields correctly injected and the second class
      myPackage.MyResource2 does not have @Autowired fields correctly
      injected


Here is the stack trace for the constructor of myPackage.MyResource1
*(@Autowired works)*:

java.lang.Exception: Stack trace at
java.lang.Thread.dumpStack(Thread.java:1206)
         at myPackage.MyResource1.<init>
         at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
         at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
         at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
         at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
         at
org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
         at
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:74)
         at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958)
         at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911)
         at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
         at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
         at
org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
         at
org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
         at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
         at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
         at
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)
         at
com.sun.jersey.spi.spring.container.SpringComponentProviderFactory$SpringManagedComponentProvider.getInstance(SpringComponentProviderFactory.java:235)
         at
com.sun.jersey.server.impl.component.IoCResourceFactory$PerRequestWrapper.getInstance(IoCResourceFactory.java:150)


         at
com.sun.jersey.server.impl.application.WebApplicationContext.getResource(WebApplicationContext.java:238)
         at
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
         at
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
         at
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
         at
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
         at
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
         at
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
         at
org.glassfish.grizzly.servlet.ServletHandler$FilterChainImpl.doFilter(ServletHandler.java:985)

Here is the stack trace for how my jersey resource class
mypackage.MyResource2 is being constructed *(@Autowired does not work)*:

java.lang.Exception: Stack trace at
java.lang.Thread.dumpStack(Thread.java:1206)
         at myPackage.MyResource2.<init>
         at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
         at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
         at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
         at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
         at
com.sun.jersey.server.spi.component.ResourceComponentConstructor._construct(ResourceComponentConstructor.java:191)
         at
com.sun.jersey.server.spi.component.ResourceComponentConstructor.construct(ResourceComponentConstructor.java:179)
         at
com.sun.jersey.server.impl.resource.PerRequestFactory$PerRequest._getInstance(PerRequestFactory.java:182)
         at
com.sun.jersey.server.impl.resource.PerRequestFactory$AbstractPerRequest.getInstance(PerRequestFactory.java:144)

         at
com.sun.jersey.server.impl.application.WebApplicationContext.getResource(WebApplicationContext.java:238)
         at
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
         at
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
         at
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
         at
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
         at
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
         at
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
         at
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
         at
org.glassfish.grizzly.servlet.ServletHandler$FilterChainImpl.doFilter(ServletHandler.java:985)


I notice that in both stack traces start out the same from the bottom
up. Then they diverge (after the blank line).
The good case uses
com.sun.jersey.server.impl.component.IoCResourceFactory while the
problem case uses com.sun.jersey.server.impl.resource.PerRequestFactory.

What could I be doing wrong to see these two different behaviors for two
different top level resource classes in the same package being scanned
by jersey? Or is this a problem is jersey-spring module? What can I do
to make this work?

Thanks for your help.

-- 
Regards,
Farrukh Najmi
Web: http://www.wellfleetsoftware.com