On Tue June 16 2009 8:54:18 am ilgvars wrote:
> Problem solved after upgrading to CXF 2.2.2 and using setter to inject
> @Context resource:
Was just going to suggest that. With Spring AOP, we don't have access to the
"real" object, just the proxy. Thus, we don't have access to fields.
However, setter methods are also proxied so we can call them.
Dan
>
> @Service
> @Transactional
> public class MyServiceBean implements Service {
>
>
> private MessageContext mc;
>
> @Context
> public void setMessageContext(MessageContext messageContext) {
> this.messageContext = messageContext;
> }
>
> .......
> }
>
> ilgvars wrote:
> > Hi,
> > I've been trying to inject jax-rs resources using @Context into Spring
> > service bean which also has @Transactional annotation. But Spring context
> > fails to start. CXF version is 2.2.1, Spring is 2.5.6, using Jetty 6 as
> > web container.
> >
> > Service example:
> >
> > import javax.ws.rs.core.Context;
> > import org.apache.cxf.jaxrs.ext.MessageContext;
> > ...
> >
> > @Service
> > @Transactional
> > public class MyServiceBean implements Service {
> >
> > @Context
> > private MessageContext mc;
> >
> > // implementation
> > ....
> > }
> >
> > Spring config:
> >
> > <context:annotation-config />
> > <context:component-scan base-package="...." />
> > <tx:annotation-driven>
> >
> >
> > <import resource="classpath:META-INF/cxf/cxf.xml" />
> > <import
> > resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />
> > <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
> >
> >
> > <jaxrs:server id="transport" address="/">
> > <jaxrs:serviceBeans>
> > <ref bean="myServiceBean" />
> > ....
> > </jaxrs:serviceBeans>
> > <jaxrs:extensionMappings>
> > <entry key="xml" value="application/xml" />
> > <entry key="json" value="application/json" />
> > </jaxrs:extensionMappings>
> > </jaxrs:server>
> >
> >
> >
> >
> > During Spring context startup I'm getting:
> > 2009-06-16 07:38:21,430 ERROR [org.mortbay.log] - Failed startup of
> > context
> > org.mortbay.jetty.webapp.webappcont...@ed9f47{/alayer-da,src/main/webapp}
> > org.springframework.beans.factory.BeanCreationException: Error creating
> > bean with name 'transport': Invocation of init method failed; nested
> > exception is org.apache.cxf.service.factory.ServiceConstructionException
> > at
> > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact
> >ory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338) at
> > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact
> >ory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) at
> > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact
> >ory$1.run(AbstractAutowireCapableBeanFactory.java:409) at
> > java.security.AccessController.doPrivileged(Native Method)
> > at
> > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact
> >ory.createBean(AbstractAutowireCapableBeanFactory.java:380) at
> > org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject
> >(AbstractBeanFactory.java:264) at
> > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.ge
> >tSingleton(DefaultSingletonBeanRegistry.java:222) at
> > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(A
> >bstractBeanFactory.java:261) at
> > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(Abs
> >tractBeanFactory.java:185) at
> > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(Abs
> >tractBeanFactory.java:164) at
> > org.springframework.beans.factory.support.DefaultListableBeanFactory.preI
> >nstantiateSingletons(DefaultListableBeanFactory.java:429) at
> > org.springframework.context.support.AbstractApplicationContext.finishBean
> >FactoryInitialization(AbstractApplicationContext.java:728) at
> > org.springframework.context.support.AbstractApplicationContext.refresh(Ab
> >stractApplicationContext.java:380) at
> > org.springframework.web.context.ContextLoader.createWebApplicationContext
> >(ContextLoader.java:255) at
> > org.springframework.web.context.ContextLoader.initWebApplicationContext(C
> >ontextLoader.java:199) at
> > org.springframework.web.context.ContextLoaderListener.contextInitialized(
> >ContextLoaderListener.java:45) at
> > org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java
> >:540) at org.mortbay.jetty.servlet.Context.startContext(Context.java:135)
> > at
> > org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:12
> >20) at
> > org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:510)
> > at
> > org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) at
> > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
> > at
> > org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.jav
> >a:152) at
> > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
> > at
> > org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
> > at org.mortbay.jetty.Server.doStart(Server.java:222)
> > at
> > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
> > at
> > com.itella.alayer.common.server.EmbeddedJettyServer.start(EmbeddedJettySe
> >rver.java:37) at
> > com.itella.alayer.da.server.tests.DaJettyServer.main(DaJettyServer.java:3
> >6) Caused by: org.apache.cxf.service.factory.ServiceConstructionException
> > at
> > org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean
> >.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > at
> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java
> >:39) at
> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorI
> >mpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
> > at
> > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact
> >ory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1414)
> > at
> > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact
> >ory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1375) at
> > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact
> >ory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335) ... 28
> > more
> > Caused by: java.lang.IllegalArgumentException: Can not set
> > org.apache.cxf.jaxrs.ext.MessageContext field
> > com.itella.alayer.da.server.services.FileInputsBean.mc to $Proxy16
> > at
> > sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unsa
> >feFieldAccessorImpl.java:146) at
> > sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unsa
> >feFieldAccessorImpl.java:150) at
> > sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.jav
> >a:37) at
> > sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorIm
> >pl.java:57) at java.lang.reflect.Field.set(Field.java:657)
> > at
> > org.apache.cxf.jaxrs.utils.InjectionUtils$1.run(InjectionUtils.java:129)
> > at java.security.AccessController.doPrivileged(Native Method)
> > at
> > org.apache.cxf.jaxrs.utils.InjectionUtils.injectFieldValue(InjectionUtils
> >.java:125) at
> > org.apache.cxf.jaxrs.utils.InjectionUtils.injectContextProxies(InjectionU
> >tils.java:661) at
> > org.apache.cxf.jaxrs.JAXRSServerFactoryBean.injectContexts(JAXRSServerFac
> >toryBean.java:180) at
> > org.apache.cxf.jaxrs.JAXRSServerFactoryBean.updateClassResourceProviders(
> >JAXRSServerFactoryBean.java:201) at
> > org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean
> >.java:81) ... 35 more
> >
> > Looks like CXF is trying to do field injection but it can't do that for
> > Spring generated Proxy (which is required for transaction support).
> > I also was trying to use CGLIB proxies with <tx:annotation-driven
> > proxy-target-class="true"/> and also aspectj weaving but with no luck. In
> > this case MessageContext was left null. And also method based @Context
> > injection doesn't work in this case.
> >
> > Does anybody has similar issues with combination of @Context and
> > @Transactional?
--
Daniel Kulp
[email protected]
http://www.dankulp.com/blog