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: Tue, 04 Oct 2011 08:18:37 -0400

Having debugged this some more it appears that the following
meta-annotation if used correctly may solve my problem:

http://jersey.java.net/nonav/apidocs/1.4/jersey/com/sun/jersey/server/spi/component/ResourceComponentProviderFactory.html

Does any one have an example of how to use this meta-annotation on a
jersey resource class?

Also, I am not sure why it is that two different resource classes in my
package with similar annotations and design, behave differently as to
which resource factory is used for each. Can any one shed any light on this?

Thanks for your help.

On 10/03/2011 04:52 PM, Farrukh Najmi wrote:
>
>
> 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