osgibundleapache-felixosgi-bundleipojo

Using iPOJO API shows " Cannot create a POJO instance, the POJO constructor cannot be found"


iPOJO API seems complicated to deal with, especially when embedding OSGI framework. After getting done with the class loader issues by keeping the API coding lines in an OSGI bundle, I am here having a new different issue:

In my bundle start method, I have the following code:

public void start(BundleContext context)
{

    ComponentType x = new PrimitiveComponentType()
            .setBundleContext(context)
            .setClassName(InstanceFactoryImpl.class.getName())
            .setValidateMethod("start")
            .setInvalidateMethod("stop");


            x.start();

            try {
                x.createInstance();
            } catch (UnacceptableConfiguration e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (MissingHandlerException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println("and we are done!");
}

InstanceFactoryImpl class is in the same package as the following:

public class InstanceFactoryImpl implements instancefactory.InstanceFactory{


    @Override
    public void start() {



    }

    @Override
    public void stop() {

    }



}

When I load my bundle to Felix framework in my java application, I get the following error:

[ERROR]  : [instancefactoryImpl.InstanceFactoryImpl-0] createInstance -> Cannot invoke the constructor (method not found) : instancefactoryImpl.InstanceFactoryImpl.<init>(org.apache.felix.ipojo.InstanceManager)
java.lang.NoSuchMethodException: instancefactoryImpl.InstanceFactoryImpl.<init>(org.apache.felix.ipojo.InstanceManager)
    at java.lang.Class.getConstructor0(Class.java:2715)
    at java.lang.Class.getDeclaredConstructor(Class.java:1987)
    at org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:726)
    at org.apache.felix.ipojo.InstanceManager.getPojoObject(InstanceManager.java:923)
    at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.__M_stateChanged(LifecycleCallbackHandler.java:156)
    at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.stateChanged(LifecycleCallbackHandler.java)
    at org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)
    at org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)
    at org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)
    at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)
    at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)
    at org.apache.felix.ipojo.api.ComponentType.createInstance(ComponentType.java:79)
    at instancefactoryImpl.Activator.start(Activator.java:37)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2146)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
    at embedder.HostApplication.<init>(HostApplication.java:148)
    at embedder.Embedder.main(Embedder.java:12)
[ERROR] instancefactoryImpl.InstanceFactoryImpl : Cannot create a POJO instance, the POJO constructor cannot be found
org.apache.felix.ipojo.ConfigurationException: The configuration is not correct for the type instancefactoryImpl.InstanceFactoryImpl : Cannot create a POJO instance, the POJO constructor cannot be found
    at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:328)
    at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)
    at org.apache.felix.ipojo.api.ComponentType.createInstance(ComponentType.java:79)
    at instancefactoryImpl.Activator.start(Activator.java:37)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2146)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
    at embedder.HostApplication.<init>(HostApplication.java:148)
    at embedder.Embedder.main(Embedder.java:12)
Caused by: org.apache.felix.ipojo.ConfigurationException: Cannot create a POJO instance, the POJO constructor cannot be found
    at org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:191)
    at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)
    ... 10 more
Caused by: java.lang.RuntimeException: Cannot create a POJO instance, the POJO constructor cannot be found
    at org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:766)
    at org.apache.felix.ipojo.InstanceManager.getPojoObject(InstanceManager.java:923)
    at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.__M_stateChanged(LifecycleCallbackHandler.java:156)
    at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.stateChanged(LifecycleCallbackHandler.java)
    at org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)
    at org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)
    at org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)
    ... 11 more
Caused by: java.lang.NoSuchMethodException: instancefactoryImpl.InstanceFactoryImpl.<init>(org.apache.felix.ipojo.InstanceManager)
    at java.lang.Class.getConstructor0(Class.java:2715)
    at java.lang.Class.getDeclaredConstructor(Class.java:1987)
    at org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:726)
    ... 17 more

I am getting the error at the following line:

x.createInstance();

I tried to explicitly define a constructor, and to add a method called "init". All this failed, and the same error keeps showing. What should I do? Thanks?


Solution

  • You have a version mismatch between the iPOJO core bundle and the iPOJO API bundle. If you are using iPOJO 1.11.0 then you'll need to use iPOJO API 1.11.0.

    In iPOJO 1.11.0 we changed the manipulator process. This makes your bundle, which was instrumented by an older version of the iPOJO API, unsuitable.

    More details on https://issues.apache.org/jira/browse/FELIX-4443