Использование iPOJO API показывает Невозможно создать экземпляр POJO, не удается найти конструктор POJO

API iPOJO кажется сложным, особенно при встраивании среды OSGI. После того, как я разобрался с проблемами загрузчика классов, сохранив строки кода API в пакете OSGI, у меня возникла новая проблема:

В моем методе запуска пакета у меня есть следующий код:

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 находится в том же пакете, что и следующий:

public class InstanceFactoryImpl implements instancefactory.InstanceFactory{


    @Override
    public void start() {



    }

    @Override
    public void stop() {

    }



}

Когда я загружаю свой пакет в структуру Felix в своем Java-приложении, я получаю следующую ошибку:

[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

Я получаю ошибку в следующей строке:

x.createInstance();

Я попытался явно определить конструктор и добавить метод с именем «init». Все это не удалось, и та же самая ошибка продолжает показывать. Что я должен делать? Спасибо?


person Traveling Salesman    schedule 02.03.2014    source источник
comment
Реализует ли ваш класс ComponentType фабричный метод .createInstance() без аргументов?   -  person keshlam    schedule 02.03.2014


Ответы (1)


У вас есть несоответствие версий между основным пакетом iPOJO и пакетом API iPOJO. Если вы используете iPOJO 1.11.0, вам необходимо использовать iPOJO API 1.11.0.

В iPOJO 1.11.0 мы изменили процесс манипулятора. Это делает ваш пакет, который был оснащен более старой версией iPOJO API, непригодным.

Подробнее на https://issues.apache.org/jira/browse/FELIX-4443< /а>

person Clement    schedule 03.03.2014
comment
В интересах других, пожалуйста, прочитайте свой ответ и обновите его. Я думаю, что это опечатки. Спасибо. - person Traveling Salesman; 04.03.2014
comment
как узнать версию IPOJO!? - person mina; 11.05.2015
comment
Либо это написано в имени файла пакета, либо это версия пакета (в манифесте пакета). - person Clement; 13.05.2015