Hi, The problem is that jaxrs:server declaration is interfering, Using jaxrs:server is a non-DOSGi way, with explicit jaxrs:server declarations one provides all the info needed for JAX-RS endpoints be created. DOSGI endpoint publication process is always initiated directly or indirectly by BundleContext.registerService call. Have a look please at http://cxf.apache.org/distributed-osgi-reference.html#DistributedOSGiReference-ServiceProviderpropertiesForConfiguringRESTfulJAXRSbasedendpointsandconsumers,
there's info there on how to register custom providers, from Activators, as OSGI services on its own, or using declarative properties Hope it helps, Sergey On Mon, Jul 11, 2011 at 7:06 AM, mah <[email protected]> wrote: > I am using Apache Felix 3.2.2 with CXF DOSGi 1.2. What I am trying to achieve > is to export a service (distributed OSGi) with REST and also register > message body provider. My example is based on greeter_rest [1]. > > When I am not registering my own message body provider, everything works > "fine", I just get "No message body writer has been found for response class > MyObject." message when I am accessing REST webservice. However, when I am > trying to register message body provider, I get > org.springframework.beans.factory.BeanCreationException: Error creating bean > with name 'testServiceBean': Initialization of bean failed; nested exception > is java.lang.StackOverflowError > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) > 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.apache.cxf.bus.spring.BusApplicationContext.<init>(BusApplicationContext.java:91) > at > org.apache.cxf.bus.spring.SpringBusFactory.createApplicationContext(SpringBusFactory.java:102) > at > org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:93) > at > org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:86) > at > org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:64) > at > org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:53) > at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:69) > at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:106) > at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:97) > at > org.apache.cxf.endpoint.AbstractEndpointFactory.getBus(AbstractEndpointFactory.java:82) > at > org.apache.cxf.jaxrs.spring.JAXRSServerFactoryBeanDefinitionParser$SpringJAXRSServerFactoryBean.setApplicationContext(JAXRSServerFactoryBeanDefinitionParser.java:167) > at > org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:70) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350) > ... > > And I see a lot of repeating messaging blocks in the log: > INFO: Refreshing org.apache.cxf.bus.spring.BusApplicationContext@1257687: > display name [org.apache.cxf.bus.spring.BusApplicationContext@1257687]; > startup date [Mon Jul 11 07:49:00 CEST 2011]; root of context hierarchy > Jul 11, 2011 7:49:00 AM > org.springframework.beans.factory.xml.XmlBeanDefinitionReader > loadBeanDefinitions > INFO: Loading XML bean definitions from class path resource > [META-INF/cxf/cxf.xml] > Jul 11, 2011 7:49:00 AM > org.springframework.context.support.AbstractApplicationContext > obtainFreshBeanFactory > INFO: Bean factory for application context > [org.apache.cxf.bus.spring.BusApplicationContext@1257687]: > org.springframework.beans.factory.support.DefaultListableBeanFactory@db38a4 > Jul 11, 2011 7:49:00 AM > org.springframework.beans.factory.support.DefaultListableBeanFactory > preInstantiateSingletons > INFO: Pre-instantiating singletons in > org.springframework.beans.factory.support.DefaultListableBeanFactory@db38a4: > defining beans [testServiceBean,myObjectProvider]; root of factory hierarchy > Jul 11, 2011 7:49:00 AM > org.springframework.context.support.AbstractApplicationContext > prepareRefresh > > Here is my code and configurations > > META-INF/spring/spring.xml: > <beans xmlns="http://www.springframework.org/schema/beans" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xmlns:jaxrs="http://cxf.apache.org/jaxrs" > xsi:schemaLocation=" > http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans.xsd > http://cxf.apache.org/jaxrs > http://cxf.apache.org/schemas/jaxrs.xsd"> > > <import resource="classpath:META-INF/cxf/cxf.xml" /> > </beans> > > META-INF/cxf/cxf.xml: > <beans xmlns="http://www.springframework.org/schema/beans" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xmlns:jaxrs="http://cxf.apache.org/jaxrs" > xsi:schemaLocation=" > http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans.xsd > http://cxf.apache.org/jaxrs > http://cxf.apache.org/schemas/jaxrs.xsd"> > > <jaxrs:server id="testServiceBean"> > <jaxrs:providers> > <ref bean="myObjectProvider" /> > </jaxrs:providers> > </jaxrs:server> > > <bean name="myObjectProvider" class="my.test.spring.MyObjectProvider" /> > </beans> > > spring.handlers: > http\://cxf.apache.org/jaxrs=org.apache.cxf.jaxrs.spring.NamespaceHandlerhttp\://cxf.apache.org/jaxrs=org.apache.cxf.jaxrs.spring.NamespaceHandler > > Activator.java: > package my.test.spring.internal; > > import java.util.Dictionary; > import java.util.Hashtable; > > import my.test.spring.TestService; > > import org.osgi.framework.BundleActivator; > import org.osgi.framework.BundleContext; > > public class Activator implements BundleActivator { > > @Override > public void start(BundleContext context) throws Exception { > Dictionary<String, String> props = new Hashtable<String, > String>(); > > props.put("service.exported.interfaces", "*"); > props.put("service.exported.configs", "org.apache.cxf.rs"); > props.put("service.exported.intents", "HTTP"); > props.put("org.apache.cxf.rs.address", "http://localhost:8080/"); > // props.put("org.apache.cxf.rs.databinding", "aegis"); > > context.registerService(TestService.class.getName(), new TestService(), > props); > } > > @Override > public void stop(BundleContext context) throws Exception { > System.out.println("Stop"); > } > } > > MyObject.java: > package my.test.spring; > > public class MyObject { > > private String s; > > public MyObject(String s) { > this.s = s; > } > > public String getS() { > return s; > } > } > > MyObjectProvider: > package my.test.spring; > > import java.io.IOException; > import java.io.OutputStream; > import java.lang.annotation.Annotation; > import java.lang.reflect.Type; > > import javax.ws.rs.Produces; > import javax.ws.rs.WebApplicationException; > import javax.ws.rs.core.MediaType; > import javax.ws.rs.core.MultivaluedMap; > import javax.ws.rs.ext.MessageBodyWriter; > import javax.ws.rs.ext.Provider; > > @Produces("text/plain") > @Provider > public class MyObjectProvider implements MessageBodyWriter<MyObject> { > > @Override > public long getSize(MyObject arg0, Class<?> arg1, Type arg2, Annotation[] > arg3, MediaType arg4) { > System.out.println("11111111111111111111"); > return 0; > } > > @Override > public boolean isWriteable(Class<?> arg0, Type arg1, Annotation[] arg2, > MediaType arg3) { > System.out.println("222222222222222"); > // return false; > return true; > } > > @Override > public void writeTo(MyObject arg0, Class<?> arg1, Type arg2, Annotation[] > arg3, MediaType arg4, > MultivaluedMap<String, Object> arg5, OutputStream arg6) throws > IOException, WebApplicationException { > System.out.println("333333333333333333"); > } > } > > TestService.java: > package my.test.spring; > > import javax.ws.rs.GET; > import javax.ws.rs.Path; > import javax.ws.rs.PathParam; > import javax.ws.rs.Produces; > > @Path("testService") > public class TestService { > > @GET > @Path("printParam/{param}") > @Produces("text/plain") > public MyObject printParam(@PathParam("name") String param) { > System.out.println(" ## printParam called"); > return new MyObject("This is param: " + param); > } > } > > MANIFEST.MF: > Manifest-Version: 1.0 > Export-Package: my.test.spring;uses:="javax.ws.rs,javax.ws.rs.ext,java > x.ws.rs.core" > Built-By: mah > Tool: Bnd-1.15.0 > Bundle-Name: My Spring Test > Created-By: Apache Maven Bundle Plugin > Build-Jdk: 1.6.0_21 > Bundle-Version: 1.0.0.SNAPSHOT > Bnd-LastModified: 1310363980475 > Bundle-ManifestVersion: 2 > Bundle-Activator: my.test.spring.internal.Activator > Import-Package: javax.ws.rs;version="[1.0,2)",javax.ws.rs.core;version > ="[1.0,2)",javax.ws.rs.ext;version="[1.0,2)",my.test.spring,org.osgi. > framework;version="[1.5,2)",org.apache.cxf.jaxrs.spring > Bundle-SymbolicName: springTest > > Any help is appreciated. > > [1] http://svn.apache.org/repos/asf/cxf/dosgi/trunk/samples/greeter_rest/ > > > -- > View this message in context: > http://cxf.547215.n5.nabble.com/org-springframework-beans-factory-BeanCreationException-Error-creating-bean-with-name-testServiceBear-tp4574006p4574006.html > Sent from the cxf-user mailing list archive at Nabble.com. > -- Sergey Beryozkin http://sberyozkin.blogspot.com Talend - http://www.talend.com
