You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by ilgvars <il...@itella.com> on 2009/06/16 06:49:16 UTC

Combining jax-rs @Context and Spring @Transactional annotations

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.WebAppContext@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.


RE: Combining jax-rs @Context and Spring @Transactional annotations

Posted by Jecis Ilgvars <Il...@itella.com>.
Thanks for reply anyway :)


-----Original Message-----
From: Daniel Kulp [mailto:dkulp@apache.org]
Sent: Tue 2009.06.16. 16:14
To: users@cxf.apache.org
Cc: Jecis Ilgvars
Subject: Re: Combining jax-rs @Context and Spring @Transactional annotations
 
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.WebAppContext@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
dkulp@apache.org
http://www.dankulp.com/blog


RE: Extension mappings (Re: Combining jax-rs @Context and Spring @Transactional annotations)

Posted by Jecis Ilgvars <Il...@itella.com>.
Thanks, good to know


-----Original Message-----
From: Sergey Beryozkin [mailto:sberyozk@progress.com]
Sent: Tue 2009.06.16. 18:39
To: users@cxf.apache.org
Cc: Jecis Ilgvars
Subject: Extension mappings (Re: Combining jax-rs @Context and Spring @Transactional annotations)
 
Hi,
>> >
>> >   <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>
>> >

Just FYI, those extensionMappings values are supported by default...

cheers, Sergey


Extension mappings (Re: Combining jax-rs @Context and Spring @Transactional annotations)

Posted by Sergey Beryozkin <sb...@progress.com>.
Hi,
>> >
>> >   <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>
>> >

Just FYI, those extensionMappings values are supported by default...

cheers, Sergey

Re: Combining jax-rs @Context and Spring @Transactional annotations

Posted by Daniel Kulp <dk...@apache.org>.
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.WebAppContext@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
dkulp@apache.org
http://www.dankulp.com/blog

Re: Combining jax-rs @Context and Spring @Transactional annotations

Posted by ilgvars <il...@itella.com>.
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.WebAppContext@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.