JAVA OSGi: InstantiationException с декларативными службами

Я новичок в OSGi и создаю первую реализацию DS.

Все закодировано по "книге", но при запуске я получаю эту ошибку:

java.lang.InstantiationException: com.mine.logger.internal.udp.UdpListener
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.eclipse.equinox.internal.ds.model.ServiceComponent.createInstance(ServiceComponent.java:457)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.createInstance(ServiceComponentProp.java:264)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:325)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:588)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:196)
at org.eclipse.equinox.internal.ds.Resolver.getEligible(Resolver.java:328)
at org.eclipse.equinox.internal.ds.SCRManager.serviceChanged(SCRManager.java:221)
at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:104)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:933)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:227)
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:149)
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:756)
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:711)
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:130)
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:206)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:507)
at org.eclipse.equinox.internal.ds.InstanceProcess.registerService(InstanceProcess.java:504)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:212)
at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:441)
at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:213)
at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:800)
at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:767)
at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)

Это файл configuration.xml модуля, который я хочу использовать в других:

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="startup" deactivate="shutdown" immediate="true" name="com.mine.logger.storeindb">
   <implementation class="com.mine.logger.internal.storeindb.StoreLog"/>
   <service>
      <provide interface="com.mine.logger.storeindb.IStoreLog"/>
   </service>
</scr:component>

А это файл configuration.xml модуля, который будет его использовать:

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="com.mine.logger.udp">
   <implementation class="com.mine.logger.internal.udp.UdpListener"/>
   <reference bind="setStoreLog" interface="com.mine.logger.storeindb.IStoreLog" name="storelog" unbind="unsetStoreLog"/>
</scr:component>

Код для привязки и отвязки:

private IStoreLog storeLog;

public void setStoreLog(IStoreLog value)
{
    System.err.println("UdpListener > setStoreLog");
    this.storeLog = value;
}

public void unsetStoreLog(IStoreLog value)
{
    System.err.println("UdpListener > unsetStoreLog");
    if (this.storeLog == value) {
        this.storeLog = null;
    }
}

Есть идеи? Спасибо, Фрэнк


person Frank    schedule 09.12.2010    source источник


Ответы (4)


InstantiationException:

Возникает, когда приложение пытается создать экземпляр класса с помощью метода newInstance в классе Class, но не удается создать экземпляр указанного объекта класса. Создание экземпляра может завершиться неудачно по разным причинам, включая, помимо прочего:

  • объект класса представляет абстрактный класс, интерфейс, класс массива, примитивный тип или пустоту
  • класс не имеет нулевого конструктора

Есть ли общедоступный конструктор без аргументов для com.mine.logger.internal.udp.UdpListener ?

person Thilo    schedule 09.12.2010

Спасибо Тило!

добавлена ​​функция без аргументов, и ошибка исчезла!

public UdpListener() 
{
    // public, no-args constructor needed for Declarative Services !!!
}

public UdpListener(int port) 
{
    this.port = port;
}
person Frank    schedule 09.12.2010
comment
Вы только что ответили на свой вопрос комментарием. Это не форум. Вы должны просто принять правильный ответ и/или добавить комментарии к другим ответам или вашему вопросу. Вы также можете отредактировать свой вопрос, если хотите. - person musiKk; 09.12.2010

Опечатка? Поле IStoreLog называется storeLog, но вы говорите name="storelog" (нижний регистр l).

person Andreas Dolk    schedule 09.12.2010
comment
нет, тот же результат, имя, похоже, используется только как метка, а не как код. Тот же результат с: › - person Frank; 09.12.2010

У меня была аналогичная проблема, вызванная ссылкой на закрытый класс. Что-то типа:

в файле ServiceAImpl.java:

class ServiceBImpl implements Service {
...
}

Это был результат неудачного рефакторинга.

person Seweryn Niemiec    schedule 11.09.2013