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&lt;String, String&gt; props = new Hashtable&lt;String,
String&gt;();

    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&lt;String, Object&gt; 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&lt;String, String&gt; props = new Hashtable&lt;String,
> String&gt;();
>
>    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&lt;String, Object&gt; 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