Невозможно выставить объектный компонент службы osgi как класс, а не интерфейс - PullRequest
0 голосов
/ 26 сентября 2018

Я бы хотел экспортировать bean-компонент из одного контекста в другой.Проблемы начинаются, когда у этого компонента нет интерфейса, такого как MongoClient.Регистр контекста первого пакета Mongoclient, но когда я хочу представить его другому, я получаю: «В реестре не найдено bean-компонента для mongo типа: com.mongodb.Mongo» из ссылочного комплекта.Есть ли способ определить bean-компонент в реестре OSGi по классу, а не по интерфейсу?

Исключение исходит из набора ссылок:

Исключение в потоке "SpringOsgiExtenderThread-86"
org.apache.camel.RuntimeCamelException:
org.apache.camel.FailedToCreateRouteException: не удалось создать маршрут article-author-getAll at: >>> Filter [{in ([header {operationName} ==
getAllAuthors])} -> [SetHeader [CamelMongoDbLimit, {2}],
В [mongodb: mongo? Database = xxxx & collection = xxxx & operation = findAll], войти [после db выберите getAllAuthors $ {body}]]] <<< в маршруте:<br> Маршрут (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>

Код отконтекст пакета ference:

<reference id="mongoDataSourceReference" bean-name="mongoDatasource" 
context-class-loader="service-provider" 
interface="com.mongodb.MongoClient"/>

MongoClient не имеет интерфейса и osgi: ссылка должна иметь определенное свойство интерфейса.

Я попытался расширить класс 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?

1 Ответ

0 голосов
/ 28 сентября 2018

До того, как получит ссылку на существующий компонент службы OSGi, сначала необходимо экспортировать этот компонент в качестве службы 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 Service Platform определяет термин интерфейс сервиса для представления спецификации открытых методов сервиса.Обычно это будет интерфейс Java, но спецификация также поддерживает регистрацию объектов службы под именем класса , поэтому интерфейс службы фраз можно интерпретировать как ссылку на интерфейс или класс.

Таким образом, теоретически ничто не должно мешать вам получить ссылку на ваш бин Mongo, используя полное имя класса.

...