0

CDI 環境で Elasticsearch リポジトリを使用するために、CDI 統合に関するSpring Data Elasticsearchドキュメントに従いました。

つまり、関連する依存関係を Maven にインポートし、ElasticsearchOperations を Bean として利用できるようにしました。

その結果、潜在的な Elasticsearch リポジトリを初期化しようとすると、ElasticsearchRepositoryExtension によって UnsatisfiedResolutionException がスローされます。おそらく、ElasticsearchRepositoryExtension の実行前に ElasticsearchOperations Bean が初期化されていません。

これはバグですか、それとも設定ミスですか?

  • JDK8
  • ジャバEE7
  • ワイルドフライ 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());
    }

スタックトレース

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)
4

3 に答える 3

0

Spring Data CDI 拡張機能は、溶接バグのためにすべて壊れています: https://issues.jboss.org/browse/WELD-2185

Weld は ArraySet を使用して修飾子を Bean に格納します。修飾子を Bean に格納し、ProcessAnnotatedType に基づくカスタム Bean インスタンスを修飾子とともに登録する拡張機能は、修飾子によって 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/ldogin/wildfly-quickstart-spring-data/blob/master/src/main/java/org/springframework/data/couchbase/repository/cdi から入手できます。 /CouchbaseRepositoryExtension.java

于 2016-06-24T09:02:59.720 に答える
0

私は自分でいくつかの調査を行い、何が問題なのかを発見しました。

BeanはElasticsearchOperationsCDI から (実際には Elasticsearch CDI 拡張から) 選択され、Bean 修飾子 (デフォルトでは@Anyおよび@Default) をキーとしてマップに配置されます。ここでの問題はtoString()、修飾子の順序をキーにハードコーディングするキーを設定する前にメソッドが呼び出されることです。

後の段階で、同じ修飾子の順序が異なる (@Defaultおよび@Any) リポジトリ Bean が検出されます。したがって、ElasticsearchOperationsリポジトリに関連付けるためにマップから を取得することはできません。

リポジトリとElasticsearchOperationsプロデューサー メソッドの両方にカスタム修飾子を設定することで、この問題を克服することができました。そうすることで、修飾子の順序が同じになりました。しかし、その後、別の問題が発生しました...

Spring Data JPA とそれぞれの CDI 拡張機能も使用していることに言及する時が来ました。問題は、両方の拡張機能が各リポジトリ Bean を処理し (それらが実装する Repostiory インターフェースに関係なく)、同じ Bean を 2 回登録することになり、これは受け入れられないことです。

于 2014-11-21T09:11:31.650 に答える