Использование 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". Все это не удалось, и продолжает появляться та же ошибка. Что я должен делать? Спасибо?

1 ответ

Решение

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

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

Более подробная информация на https://issues.apache.org/jira/browse/FELIX-4443

Другие вопросы по тегам