无法将 OSGi 服务 Bean 公开为类而不是接口



我想将春豆从一个捆绑上下文导出到另一个捆绑上下文。当这个bean没有像MongoClient这样的接口时,问题就开始了。第一个捆绑包上下文注册 Mongoclient,但是当我想将其公开给另一个时,我得到:"在 mongo 类型的注册表中找不到 bean:com.mongodb.Mongo"。有没有办法按类而不是接口在OSGi注册表中定义bean?

异常来自引用包:

线程"SpringOsgiExtenderThread-86"org.apache.camel.RuntimeCamelException:

org.apache.camel.FailedToCreateRouteException:无法创建路由 article-author-getAll at:>>> Filter[{in ([header{operationName} ==
getAllAuthors](} -> [SetHeader[CamelMongoDbLimit, {2}],
To[mongodb:mongo?database=xxxx&collection=xxxx&operation=findAll], Log[after db select getAllAuthors ${body}]]] <<Route(article-author-getAll([[From[activemq:queue:backend.au...
因为无法解析终结点:
mongodb://mongo?collection=xxx&database=xxxx&operation=findAll 由于:在注册表中找不到 bean:mongo 的类型:
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 类并实现接口,然后将其公开给 osgi 注册表,我在引用包中正确接收了它,但后来我从 camelMongo 中得到了异常,我必须只定义 MongoClient 类!

骆驼蒙戈路线看起来像这样:

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

骆驼蒙戈路由期望连接字符串中的蒙戈客户端 bean。

那么有没有办法按类而不是接口定义 osgi 注册表中的 bean? 或者我应该在与 camelMongo 相同的捆绑包中定义 MongoClient bean?

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

<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。

最新更新