我想将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?
答案 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的。