当前位置: 首页 > 知识库问答 >
问题:

无法将osgi服务bean公开为类而不是接口

慕容修伟
2023-03-14

我想将spring bean从一个包上下文导出到另一个包上下文。当这个bean没有MongoClient这样的接口时,问题就开始了。第一个bundle上下文注册Mongoclient,但当我想将它公开给另一个时,我会从reference bundle得到:“no bean could found in the registry for mongo of type:com.mongodb.mongo”。有没有办法在OSGi注册表中按类而不是按接口定义一个bean?

异常来自引用包:

在服务捆绑,一切看起来都很好!

服务包中的代码如下所示:

 <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"/>
from("direct:findAll")
.to("mongodb:MYMONGOCLIENTBEAN?database=flights&collection=tickets&operation=findAll")

共有1个答案

濮阳驰
2023-03-14

在获得对现有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接口,但规范也支持在类名下注册服务对象,因此短语service interface可以解释为指代接口或类。

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

 类似资料:
  • 我想知道为什么来自UserDetailsServiceImpl类的方法不会出现在控制器中...我只能访问接口中的方法,但不能访问其他实现的方法。我尝试使用限定符,甚至制作了一个config类来在按接口注入bean时实例化impl类。 谁能告诉我我做错了什么?

  • 名称:示例-服务 命名空间:默认 标签:run=load-balancer-example 注释: 选择器:run=load-balancer-example 类型:nodeport IP:10.108.214.162 端口:9090/tcp 目标端口:9090/tcp 节点端口:31105/tcp endpoint:192.168.1.23:9090,192.168.1.24:9090 会话关联

  • 我正在为我的应用程序使用模拟存储库 以下是服务的外观片段: 以下是存储库代码: 当我使用执行main()时,它工作正常。 但是,当我想运行测试类: 它会因以下stacktrace而失败: 原因:org。springframework。豆。工厂NoSuchBean定义异常:没有类型为“edu”的合格bean。勒勒亚克。存储库。WeatherStationRepositoryMock’可用:至少需要1

  • 我在Google Container Engine上部署了一个容器,它运行良好。现在,我想公开它。 这个应用程序是一个侦听2个端口的服务。使用kubectl公开部署,我创建了2个负载均衡器,每个端口一个。 我制作了两个负载平衡器,因为kubectl expose命令似乎不允许使用多个端口。虽然我在kubectl上将其定义为type=LoadBalancer,但一旦在GKE上创建了它们,它们就被定义

  • 从文档中我看到 LoadBalancer:使用云提供商的负载平衡器对外公开服务。将自动创建外部负载均衡器路由到的NodePort和ClusterIP服务 但它没有提到什么时候选择一个而不是另一个。我能想到的Nodeport的缺点之一是安全性(在防火墙规则中打开端口),我想知道在选择其中一个时是否有其他考虑。