You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by mah <ms...@3dfacto.com> on 2011/07/11 08:06:36 UTC
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'testServiceBean': Initialization of bean failed;
nested exception is java.lang.StackOverflowError
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.
Re: org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'testServiceBean': Initialization of bean failed;
nested exception is java.lang.StackOverflowError
Posted by Sergey Beryozkin <sb...@gmail.com>.
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 <ms...@3dfacto.com> 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