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-tp24047621p24047621.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to