Использование 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