2014-11-18 2 views
0

Я следил за Spring Data Elasticsearch documentation в отношении интеграции CDI, чтобы использовать репозитории Elasticsearch в среде CDI.UnsatisfiedResolutionException, созданный при использовании Spring Data Elasticsearch в CDI

Вкратце я импортировал связанные зависимости с Maven и попытался сделать доступным ElasticsearchOperations в качестве компонента.

Результатом является исключение UnsatisfiedResolutionException, которое было вызвано ElasticsearchRepositoryExtension при попытке инициализировать потенциальные репозитории Elasticsearch. Вероятно, компонент ElasticsearchOperations не инициализирован до выполнения ElasticsearchRepositoryExtension.

Является ли это ошибкой или неправильной конфигурацией?

  • JDK 8
  • Java EE 7
  • Wildfly 8.1.0

Maven зависимость

<dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-elasticsearch</artifactId> 
     <version>1.1.0.RELEASE</version> 
    </dependency> 

Java код

@Produces 
    @ApplicationScoped 
    public ElasticsearchOperations createElasticsearchTemplate() { 
     return new ElasticsearchTemplate(NodeBuilder.nodeBuilder().local(true).node().client()); 
    } 

StackTrace

11:13:32,658 ERROR [org.jboss.as.server] (management-handler-thread - 1) JBAS015860: Redeploy of deployment "application.war" was rolled back with the following failure message: 
{"JBAS014671: Failed services" => {"jboss.deployment.unit.\"application.war\".WeldStartService" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"application.war\".WeldStartService: Failed to start service 
    Caused by: org.jboss.weld.exceptions.DefinitionException: Exception List with 1 exceptions: 
Exception 0 : 
javax.enterprise.inject.UnsatisfiedResolutionException: Unable to resolve a bean for 'org.springframework.data.elasticsearch.core.ElasticsearchOperations' with qualifiers [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()]. 
     at org.springframework.data.elasticsearch.repository.cdi.ElasticsearchRepositoryExtension.createRepositoryBean(ElasticsearchRepositoryExtension.java:76) 
     at org.springframework.data.elasticsearch.repository.cdi.ElasticsearchRepositoryExtension.afterBeanDiscovery(ElasticsearchRepositoryExtension.java:63) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93) 
     at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266) 
     at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:125) 
     at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253) 
     at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232) 
     at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169) 
     at org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:128) 
     at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:102) 
     at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:63) 
     at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:35) 
     at org.jboss.weld.bootstrap.events.AfterBeanDiscoveryImpl.fire(AfterBeanDiscoveryImpl.java:55) 
     at org.jboss.weld.bootstrap.WeldStartup.deployBeans(WeldStartup.java:372) 
     at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:79) 
     at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:92) 
     at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) 
     at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

ответ

0

ли класс, содержащий ваш метод производителя имеет боб определяющие аннотацию (например, @Dependent)? Если нет, метод производителя будет проигнорирован CDI 1.1.

+0

Нет, класс не аннотированный с какой-либо аннотации. Я попытался аннотировать его с помощью области @Dependent, и результат будет таким же. Но почему это необходимо, так как я хочу, чтобы в качестве компонента отображался возвращаемый тип метода производителя, а не класса? –

0

Я сам провел исследование и нашел, что происходит не так.

ElasticsearchOperations боб собирается из CDI (фактически с расширением Elasticsearch CDI) и поставить в карты с ключевыми боб классификаторов (по умолчанию @Any и @Default). Проблема здесь в том, что метод toString() вызывается перед установкой ключа, который заставляет порядок квалификаторов быть жестко закодированным в ключе.

На более позднем этапе открыт бобы-хранилища с одинаковыми классификаторами в разном порядке (@Default и @Any). Таким образом, невозможно получить ElasticsearchOperations с карты, чтобы связать ее с репозиторием.

Мне удалось преодолеть эту проблему, установив пользовательский классификатор как в репозитории, так и в способе изготовления ElasticsearchOperations. Таким образом, порядок отборочных теперь один и тот же. Но тогда возникла другая проблема ...

Пришло время упомянуть, что я также использую JPA Spring Data и соответствующее расширение CDI. В настоящее время проблема заключается в том, что оба процесса расширения обрабатывают каждый компонент репозитория (независимо от того, какой интерфейс они используют), что приводит к регистрации одного и того же компонента в два раза, что неприемлемо.

+0

удалось решить эту проблему? – Nikola

0

расширения Spring Data CDI все сломаны из-за ошибки сварки: https://issues.jboss.org/browse/WELD-2185

Weld использует ArraySet для хранения классификаторов в Bean. Расширения, которые хранят квалификаторы для Bean и регистрируют пользовательские экземпляры Bean на основе ProcessAnnotatedType с квалификаторами, больше не могут использовать простое сопоставление, чтобы получить Bean по его квалификаторам.

Я исправил его временно, изменив способ, которым все квалификаторы установлены в классе CdiRepositoryExtension.

   Set<Annotation> qualifiers = bean.getQualifiers().stream() 
        .sorted((e1, e2) -> Integer.compare(e1.hashCode(), 
          e2.hashCode())).collect(Collectors.toSet()); 

Для Spring Data Couchbase полный код доступен здесь: https://github.com/ldoguin/wildfly-quickstart-spring-data/blob/master/src/main/java/org/springframework/data/couchbase/repository/cdi/CouchbaseRepositoryExtension.java