导入作为单例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 [

如何导入作为单例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 [] 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>
  • bean:opaClient:它只是引用opaGateway的使用者或类:

    public class OPAClient {
        public void setOPAGateway(IOPAGateway c) {
            if(c != null) {
                System.out.println("Message: " + c.printMessage());
            }
        }
        public void unsetOPAGateway(IOPAGateway c) {
    
        }
    }
    
  • 引用侦听器:使用bind/unbind方法在
    opaClient
    中注入
    opaGateway
    的实例


  • 您可以在这里找到更多信息:

    getInstance函数是否可能不是静态的,或者它有参数?该文件是一个绑定为jar的java项目,我将其转换为一个捆绑包以供使用。尽管我可以编写一个包含getter和setter的包装类,返回“getInstance()对于那个对象,我想知道是否有一种方法来实现它。好的。但问题是:com.scb.opa.gateway.OPAGateway.getInstance(…)接受任何参数?它是静态函数吗?如果需要,您可以传递参数,也可以调用非静态函数和工厂方法,但在这两种情况下,您必须稍微更改blueprint片段。这就是为什么我要问的原因。Hi@Balazsoldos感谢您的回答。这是一个无参数方法。您能用简短的解释发布答案吗关于它的评论?如果你写了一篇文章,那就太好了!嗨@Jorge。谢谢你的回复:)。你能简单描述一下代码吗?我不确定你写的那个客户。如果你能解释的话,引用侦听器对我来说是新的,是不是解决方案的关键呢?我已经在上面添加了对代码的简要描述。希望这对您有所帮助。我还没有实现和尝试这一点,但看起来这是我寻找的解决方案。谢谢:)