Я хотел бы экспортировать компонент Spring из одного контекста пакета в другой. Проблемы начинаются, когда у этого bean-компонента нет интерфейса, такого как MongoClient. Первый регистр контекста пакета Mongoclient, но когда я хочу открыть его другому, я получаю: «не удалось найти bean-компонент в реестре для mongo типа: com.mongodb.Mongo» из эталонного пакета. Есть ли способ определить bean-компонент в реестре OSGi по классу, а не по интерфейсу?
Исключение составляет эталонный пакет:
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 не имеет интерфейса и osgi: reference должно иметь определенное свойство интерфейса.
Я попытался расширить класс MongoClient и реализовать интерфейс, а затем открыть его в реестре osgi. Я получил его правильно в эталонном пакете, но затем я получил исключение от camelMongo, где я должен определить только класс MongoClient!
Маршрут Camel Mongo выглядит так:
from("direct:findAll")
.to("mongodb:MYMONGOCLIENTBEAN?database=flights&collection=tickets&operation=findAll")
Маршрут Camel mongo ожидает bean-компонент MongoClient в строке подключения.
Итак, есть ли способ определить bean-компонент в реестре osgi по классу, а не по интерфейсу? или я должен определить bean-компонент MongoClient в том же пакете, что и camelMongo?
Перед получающий ссылкой на существующий сервисный bean-компонент OSGi, вам сначала нужно экспорт этот 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
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.
Таким образом, теоретически ничто не должно помешать вам получить ссылку на ваш bean-компонент Mongo с использованием полного имени класса.