Problem solved after upgrading to CXF 2.2.2 and using setter to inject
@Context resource:
@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.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
> at java.security.AccessController.doPrivileged(Native Method)
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
> at
> org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
> at
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
> at
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
> at
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
> at
> org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
> at
> org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.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:1220)
> 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.java: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(EmbeddedJettyServer.java:37)
> at
> com.itella.alayer.da.server.tests.DaJettyServer.main(DaJettyServer.java:36)
> 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(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1414)
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1375)
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.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(UnsafeFieldAccessorImpl.java:146)
> at
> sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
> at
> sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
> at
> sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.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(InjectionUtils.java:661)
> at
> org.apache.cxf.jaxrs.JAXRSServerFactoryBean.injectContexts(JAXRSServerFactoryBean.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?
>
>
--
View this message in context:
http://www.nabble.com/Combining-jax-rs-%40Context-and-Spring-%40Transactional-annotations-tp24047621p24053731.html
Sent from the cxf-user mailing list archive at Nabble.com.