无法将osgi服务bean作为类未接口公开

时间:2018-09-26 12:21:30

标签: spring mongodb apache-camel osgi osgi-bundle

我想将Spring bean从一个包上下文导出到另一个包上下文。当此bean没有MongoClient之类的接口时,问题就开始了。第一个绑定上下文注册Mongoclient,但是当我想将其公开给另一个绑定上下文时,我得到:“引用绑定中的类型为com.mongodb.Mongo的mongo在注册表中找不到任何bean”。有没有什么方法可以通过类而不是接口在OSGi注册表中定义bean?

异常来自参考包:

  

线程“ SpringOsgiExtenderThread-86”中的异常
  org.apache.camel.RuntimeCamelException:
  org.apache.camel.FailedToCreateRouteException:无法创建路由   article-author-getAll位于:>>>过滤器[{in([header {operationName} ==
  getAllAuthors])}-> [SetHeader [CamelMongoDbLimit,{2}],
  要[mongodb:mongo?database = xxxx&collection = xxxx&operation = findAll],   在路由中登录[在数据库选择getAllAuthors $ {body}]]] <<<之后:
  路线(article-author-getAll)[[来自[activemq:queue:backend.au ...
  由于无法解析端点:
  mongodb:// mongo?collection = xxx&database = xxxx&operation = findAll   由于:在注册表中找不到以下类型的mongo的bean:
  com.mongodb.Mongo

在服务包中,一切看起来都很好!

代码在服务包中看起来像这样:     

 <bean id="mongoDatasource" class="com.mongodb.MongoClient">
    <constructor-arg name="uri" ref="mongoClientUri" />       
</bean>

<bean id="mongoClientUri" class="com.mongodb.MongoClientURI">
<constructor-arg name="uri" value="${mongo_host}" />
</bean>

参考包上下文中的代码:

<reference id="mongoDataSourceReference" bean-name="mongoDatasource" 
context-class-loader="service-provider" 
interface="com.mongodb.MongoClient"/>

MongoClient没有接口,并且osgi:reference必须具有定义的接口属性。

我尝试扩展MongoClient类并实现Interface,然后将其公开给osgi注册表,我在参考包中正确收到了它,但是随后我从camelMongo中获得了例外,在该异常中,我只能定义MongoClient类!

骆驼蒙哥路线如下:

from("direct:findAll")
.to("mongodb:MYMONGOCLIENTBEAN?database=flights&collection=tickets&operation=findAll")

骆驼mongo路由期望连接字符串中有MongoClient bean。

那么有什么方法可以按类而不是按接口在osgi注册表中定义Bean吗? 或者我应该在与camelMongo相同的包中定义MongoClient bean?

1 个答案:

答案 0 :(得分:0)

获取对现有OSGi服务Bean的引用之前,您首先需要导出作为OSGi服务的该Bean:

<osgi:service ref="beanToPublish" interface="com.xyz.MyService"/>

尽管建议,但您的服务类不需要实现接口。 查看规格: https://docs.spring.io/spring-osgi/docs/current/reference/html/service-registry.html#service-registry:export

  

OSGi服务平台核心规范定义了术语服务   表示服务公共规范的接口   方法。通常,这将是Java接口,但是   规范还支持在类下注册服务对象   名称,因此短语服务接口可以解释为是指   到接口或类。

因此,从理论上讲,没有什么可以阻止您使用完整的类名来引用Mongo bean的。