gpt4 book ai didi

spring - 无法将 osgi 服务 bean 公开为类而不是接口(interface)

转载 作者:可可西里 更新时间:2023-11-01 10:45:55 26 4
gpt4 key购买 nike

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

异常来自引用包:

Exception in thread "SpringOsgiExtenderThread-86"
org.apache.camel.RuntimeCamelException:
org.apache.camel.FailedToCreateRouteException: Failed to create route 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}]]] <<< in route:
Route(article-author-getAll)[[From[activemq:queue:backend.au...
because of Failed to resolve endpoint:
mongodb://mongo?collection=xxx&database=xxxx&operation=findAll due to: No bean could be found in the registry for: mongo of type:
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 没有接口(interface),osgi:reference 必须定义接口(interface)属性。

我尝试扩展 MongoClient 类并实现接口(interface),然后将其暴露给 osgi 注册表我在引用包中正确接收了它,但后来我从 camelMongo 那里得到异常,我必须只定义 MongoClient 类!

Camel Mongo 路由如下所示:

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

Camel mongo 路由期望连接字符串中的 MongoClient bean。

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

最佳答案

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

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

虽然推荐,但您的服务类不需要实现接口(interface)。查看规范: https://docs.spring.io/spring-osgi/docs/current/reference/html/service-registry.html#service-registry:export

The OSGi Service Platform Core Specification defines the term service interface to represent the specification of a service's public methods. Typically this will be a Java interface, but the specification also supports registering service objects under a class name, so the phrase service interface can be interpreted as referring to either an interface or a class.

因此理论上没有什么可以阻止您使用完整的类名获取对您的 Mongo bean 的引用。

关于spring - 无法将 osgi 服务 bean 公开为类而不是接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52517658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com