PAX EXAM Rest Endpoint не доступен для теста интеграции Феликса
Я пытаюсь создать интеграционные тесты для пакета, который делает доступной конечную точку REST.
После некоторого времени, пытаясь получить сочетание зависимостей связки и maven для запуска интеграционного теста, я подумал, что все будет работать так, как ожидалось, но кажется, что конечная точка недоступна.
По крайней мере, это то, о чем мне говорит клиент-джерси, который я создал для выполнения тестов.
У меня нет ошибок, кроме того, что клиенту Джерси отказано в соединении.
Ниже я перечисляю версии PAX EXAM и FELIX, представленные в pom.xml интеграционного теста (а также основные связанные с ними зависимости):
<dependency>
<groupId>br.com.company.application.offerbase.model</groupId>
<artifactId>offer-base-model</artifactId>
</dependency>
<dependency>
<groupId>br.com.company.application.offerbase</groupId>
<artifactId>offer-base</artifactId>
</dependency>
<dependency>
<groupId>br.com.company.application.offerbase.client</groupId>
<artifactId>offer-base-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.framework</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
...
<dependency>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam-junit4</artifactId>
<version>4.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam-container-forked</artifactId>
<version>4.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam-link-mvn</artifactId>
<version>4.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam-cm</artifactId>
<version>4.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ops4j.pax.url</groupId>
<artifactId>pax-url-wrap</artifactId>
<version>2.5.2</version>
</dependency>
Было необходимо добавить около 90 зависимостей maven/bundle, чтобы запустить интеграционные тесты, что может быть очень многословным для размещения здесь.
Пожалуйста, дайте мне знать, если вам нужно, чтобы он был опубликован.
Конечная точка должна быть доступна по адресу:
http://0.0.0.0:9001/rest/api/v1/offer-base-service/
И фрагмент кода относительно этой конфигурации также приведен ниже:
<osgi:reference id="httpService" interface="org.osgi.service.http.HttpService" />
<osgi:service depends-on="httpService" interface="br.com.company.application.offerbase.api.v1.controller.OfferBaseApiController">
<osgi:service-properties>
<entry key="service.exported.interfaces" value="*" />
<entry key="service.exported.configs" value="org.apache.cxf.rs" />
<entry key="service.exported.intents" value="HTTP" />
<entry key="org.apache.cxf.rs.databinding" value="jaxb" />
<entry key="org.apache.cxf.rs.invoker" value="br.com.company.application.api.service.exporter.invoker.WebServiceInvoker" />
<entry key="org.apache.cxf.rs.provider" value="br.com.company.application.componente.json.JacksonJsonProviderDecorator" />
<!--<entry key="org.apache.cxf.rs.provider" value-ref="jsonProviderDecorator" />-->
<entry key="org.apache.cxf.rs.address" value="http://0.0.0.0:9001/rest/api/v1/offer-base-service" />
</osgi:service-properties>
<ref bean="offerBaseApiControllerImpl" />
</osgi:service>
Конечно, пакет отлично работает в моей тестовой среде, и клиент (заданный зависимостью 'offer-base-client' выше) обращается к нему нормально, когда сервер Felix запущен и работает, но я использую PAX EXAM именно для того, чтобы избежать необходимость работы сервера для выполнения интеграционных тестов.
<< Ошибка клиента из раздетого джерси >>
Я делаю что-то неправильно?
# Редактировать 1:
Кажется, интеграционные тесты не работают, потому что пакеты еще не запущены.
После проблем с подключением джерси-клиента к конечной точке я попытался получить ссылку на сервис напрямую, но также не смог.
Увеличив время ожидания при получении службы, я смог заметить ошибки отказа при инициализации некоторых пакетов.
Кажется, причина - в зависимости от соединения с базой данных (что имеет большой смысл), как может показаться ниже:
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Unable to create application context for [br.com.company.application.api.log.listener.application-log-listener], unsatisfied dependencies: Dependency on [(objectClass=br.com.company.application.api.log.service.ApplicationLogService)] (from bean [&logService])
org.springframework.context.ApplicationContextException: Application context initialization for 'br.com.company.application.api.log.listener.application-log-listener' has timed out
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.timeout(DependencyWaiterApplicationContextExecutor.java:454)
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.access$000(DependencyWaiterApplicationContextExecutor.java:50)
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$WatchDogTask.run(DependencyWaiterApplicationContextExecutor.java:105)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.activator.ContextLoaderListener] : Application context refresh failed (OsgiBundleXmlApplicationContext(bundle=br.com.company.application.api.log.listener.application-log-listener, config=osgibundle:/META-INF/spring/*.xml))
org.springframework.context.ApplicationContextException: Application context initialization for 'br.com.company.application.api.log.listener.application-log-listener' has timed out
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.timeout(DependencyWaiterApplicationContextExecutor.java:454)
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.access$000(DependencyWaiterApplicationContextExecutor.java:50)
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$WatchDogTask.run(DependencyWaiterApplicationContextExecutor.java:105)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : Deregistering service dependency dependencyDetector for OsgiBundleXmlApplicationContext(bundle=br.com.company.application.api.log.application-log-service, config=osgibundle:/META-INF/spring/*.xml)
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Timeout occurred before finding service dependencies for [OsgiBundleXmlApplicationContext(bundle=br.com.company.application.api.log.application-log-service, config=osgibundle:/META-INF/spring/*.xml)]
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Cancelled dependency watchdog...
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Closing appCtx for OsgiBundleXmlApplicationContext(bundle=br.com.company.application.api.log.application-log-service, config=osgibundle:/META-INF/spring/*.xml)
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Cleaning up appCtx OsgiBundleXmlApplicationContext(bundle=br.com.company.application.api.log.application-log-service, config=osgibundle:/META-INF/spring/*.xml)
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@23f65af2: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,applicationLogRepositoryImpl,applicationLogServiceImpl,persistenceUnitManager,entityManagerFactory,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,applicationLogServiceOsgi]; root of factory hierarchy
org.springframework.beans[org.springframework.beans.factory.support.DisposableBeanAdapter] : Invoking destroy() on bean with name 'dataSource'
org.springframework.beans[org.springframework.beans.factory.support.DisposableBeanAdapter] : Invoking destroy() on bean with name 'transactionManager'
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : Deregistering service dependency dependencyDetector for OsgiBundleXmlApplicationContext(bundle=br.com.company.application.api.log.application-log-service, config=osgibundle:/META-INF/spring/*.xml)
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Unable to create application context for [br.com.company.application.api.log.application-log-service], unsatisfied dependencies: Dependency on [(objectClass=org.springframework.transaction.PlatformTransactionManager)] (from bean [&transactionManager]), Dependency on [(&(objectClass=javax.sql.DataSource)(osgi.jndi.service.name=jdbc/dataSourceAPP))] (from bean [&dataSource])
org.springframework.context.ApplicationContextException: Application context initialization for 'br.com.company.application.api.log.application-log-service' has timed out
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.timeout(DependencyWaiterApplicationContextExecutor.java:454)
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.access$000(DependencyWaiterApplicationContextExecutor.java:50)
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$WatchDogTask.run(DependencyWaiterApplicationContextExecutor.java:105)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Поэтому я добавил библиотеки "pax-jdbc-config" и их зависимости и создал файл ".cfg", но боюсь, я не помещу его в нужное место, потому что он не работает.
Содержимое файла "org.ops4j.datasource-general.cfg":
osgi.jndi.service.name=jdbc/dataSourceAPP
osgi.jdbc.driver.class=oracle.jdbc.pool.OracleDataSource
dataSourceName=ds
url=<ORACLE_DATABASE_URL>
user=<ORACLE_DATABASE_USER>
password=<ORACLE_DATABASE_PASSWORD>
Последние строки перед запуском тестов:
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Pre-refresh completed; determining dependencies...
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : Discovered local dependency factories: []
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Creating shared instance of singleton bean 'springDatasource'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Creating instance of bean 'springDatasource'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Eagerly caching bean 'springDatasource' to allow for resolving potential circular references
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Invoking afterPropertiesSet() on bean with name 'springDatasource'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Finished creating instance of bean 'springDatasource'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Creating shared instance of singleton bean 'transactionManager'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Creating instance of bean 'transactionManager'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Eagerly caching bean 'transactionManager' to allow for resolving potential circular references
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Invoking afterPropertiesSet() on bean with name 'transactionManager'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Finished creating instance of bean 'transactionManager'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Creating shared instance of singleton bean 'httpService'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Creating instance of bean 'httpService'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Eagerly caching bean 'httpService' to allow for resolving potential circular references
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Invoking afterPropertiesSet() on bean with name 'httpService'
org.springframework.beans[org.springframework.beans.factory.support.DefaultListableBeanFactory] : Finished creating instance of bean 'httpService'
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : Adding OSGi service dependency for importer [&springDatasource] matching OSGi filter [(objectClass=javax.sql.DataSource)]
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : Adding OSGi service dependency for importer [&transactionManager] matching OSGi filter [(objectClass=org.springframework.transaction.PlatformTransactionManager)]
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : Adding OSGi service dependency for importer [&httpService] matching OSGi filter [(objectClass=org.osgi.service.http.HttpService)]
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : 3 OSGi service dependencies, 3 unsatisfied (for beans [&springDatasource, &transactionManager, &httpService]) in OsgiBundleXmlApplicationContext(bundle=br.com.algartelecom.algarcrm.offerbase.offer-base, config=osgibundle:/META-INF/spring/*.xml)
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : OsgiBundleXmlApplicationContext(bundle=br.com.algartelecom.algarcrm.offerbase.offer-base, config=osgibundle:/META-INF/spring/*.xml) is waiting for unsatisfied dependencies [[&springDatasource, &transactionManager, &httpService]]
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Registering service dependency dependencyDetector for OsgiBundleXmlApplicationContext(bundle=br.com.algartelecom.algarcrm.offerbase.offer-base, config=osgibundle:/META-INF/spring/*.xml)
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyServiceManager] : OsgiBundleXmlApplicationContext(bundle=br.com.algartelecom.algarcrm.offerbase.offer-base, config=osgibundle:/META-INF/spring/*.xml) has registered service dependency dependencyDetector with filter: (|(objectClass=javax.sql.DataSource)(objectClass=org.springframework.transaction.PlatformTransactionManager)(objectClass=org.osgi.service.http.HttpService))
org.springframework.osgi.extender[org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] : Asynch wait-for-dependencies started...
org.ops4j.pax.exam.invoker.junit[org.ops4j.pax.exam.invoker.junit.internal.ContainerTestRunner] : running findOfferProductsByNameAndFeatureValueCodeTest_NoFilters in reactor
ago 17, 2018 9:00:19 AM org.ops4j.pax.jdbc.config.impl.ServiceTrackerHelper track
INFORMAÇÕES: Waiting for service dependency: (&(objectClass=org.osgi.service.jdbc.DataSourceFactory)(osgi.jdbc.driver.class=oracle.jdbc.pool.OracleDataSource))
org.apache.aries.blueprint.core[org.apache.aries.blueprint.container.BlueprintExtender] : Stopping blueprint extender...
Я уже пытался поместить файл ".cfg" в:
<PROJECT_BASE_PATH>/ -- same place of the "pom.xml" file.
<PROJECT_BASE_PATH>/src
<PROJECT_BASE_PATH>/src/test
<PROJECT_BASE_PATH>/src/test/resources
<PROJECT_BASE_PATH>/etc
<PROJECT_BASE_PATH>/src/etc
<PROJECT_BASE_PATH>/src/test/etc
<PROJECT_BASE_PATH>/src/test/resources/etc
Какие-нибудь мысли?
Спасибо и всего наилучшего, Мауро.