导入作为单例bean(具有工厂方法)的OSGi服务
如何导入作为单例bean的导出OSGi服务? 我最终得到的异常如下所示:导入作为单例bean(具有工厂方法)的OSGi服务,osgi,osgi-bundle,jbossfuse,blueprint-osgi,Osgi,Osgi Bundle,Jbossfuse,Blueprint Osgi,如何导入作为单例bean的导出OSGi服务? 我最终得到的异常如下所示: Unable to start blueprint container for bundle opaClient org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to find a matching constructor on class com.opa.gateway.OPAGateway for arguments [
Unable to start blueprint container for bundle opaClient
org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to find a matching constructor on class com.opa.gateway.OPAGateway for arguments [] when instantiating bean opaGateway
at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:336)
导出服务的MyBlueprintXML如下所示:
<bean id="opaGateway" class="com.opa.gateway.OPAGateway" factory-method="getInstance"/>
<service ref="opaGateway" interface="com.opa.gateway.IOPAGateway" />
<reference interface="com.opa.gateway.OPAGateway" component-name="opaGateway" availability="mandatory" />
该服务在另一个包中引用,如下所示:
<bean id="opaGateway" class="com.opa.gateway.OPAGateway" factory-method="getInstance"/>
<service ref="opaGateway" interface="com.opa.gateway.IOPAGateway" />
<reference interface="com.opa.gateway.OPAGateway" component-name="opaGateway" availability="mandatory" />
有没有办法直接引用作为OSGi服务的单例bean 是的,您可以引用作为OSGi服务的singleton。确保(正如@Balazs所建议的)您的类有一个没有参数的静态函数/方法
getInstance()
看看下面的蓝图。希望它能给你一个线索。。。(如果你需要完整的样品,我可以试着贴出来
<bean id="opaGateway"
class="org.test.OPAGateway" factory-method="getInstance">
</bean>
<bean id="opaClient"
class="org.test.client.OPAClient"
init-method="startup"
destroy-method="shutdown">
</bean>
<service ref="opaGateway" interface="org.test.IOPAGateway" />
<reference interface="org.test.IOPAGateway" availability="optional">
<reference-listener bind-method="setOPAGateway"
unbind-method="unsetOPAGateway">
<ref component-id="opaClient"/>
</reference-listener>
</reference>
public class OPAClient {
public void setOPAGateway(IOPAGateway c) {
if(c != null) {
System.out.println("Message: " + c.printMessage());
}
}
public void unsetOPAGateway(IOPAGateway c) {
}
}
opaClient
中注入opaGateway
的实例您可以在这里找到更多信息:getInstance函数是否可能不是静态的,或者它有参数?该文件是一个绑定为jar的java项目,我将其转换为一个捆绑包以供使用。尽管我可以编写一个包含getter和setter的包装类,返回“getInstance()对于那个对象,我想知道是否有一种方法来实现它。好的。但问题是:com.scb.opa.gateway.OPAGateway.getInstance(…)接受任何参数?它是静态函数吗?如果需要,您可以传递参数,也可以调用非静态函数和工厂方法,但在这两种情况下,您必须稍微更改blueprint片段。这就是为什么我要问的原因。Hi@Balazsoldos感谢您的回答。这是一个无参数方法。您能用简短的解释发布答案吗关于它的评论?如果你写了一篇文章,那就太好了!嗨@Jorge。谢谢你的回复:)。你能简单描述一下代码吗?我不确定你写的那个客户。如果你能解释的话,引用侦听器对我来说是新的,是不是解决方案的关键呢?我已经在上面添加了对代码的简要描述。希望这对您有所帮助。我还没有实现和尝试这一点,但看起来这是我寻找的解决方案。谢谢:)