我是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;
}
}
有什么想法吗? 谢谢, 弗兰克
答案 0 :(得分:2)
当应用程序尝试使用类Class中的newInstance方法创建类的实例时抛出,但无法实例化指定的类对象。实例化可能由于各种原因而失败,包括但不限于:
- 类对象表示抽象类,接口,数组类,基元类型或void
- 该类没有无效的构造函数
是否有com.mine.logger.internal.udp.UdpListener
的公开,无参数构造函数?
答案 1 :(得分:1)
感谢Thilo!
添加了一个no-args函数,错误消失了!
public UdpListener()
{
// public, no-args constructor needed for Declarative Services !!!
}
public UdpListener(int port)
{
this.port = port;
}
答案 2 :(得分:0)
错字? IStoreLog
字段的名称为storeLog
,但您说name="storelog"
(小写l
)。
答案 3 :(得分:0)
我有类似的问题,引用非公开类引起的。类似的东西:
ServiceAImpl.java文件中的:
class ServiceBImpl implements Service {
...
}
这是不幸重构的结果。