1

Spring Boot および Spring Data Couchbase プロジェクトを使用して簡単なプロトタイプを作成しようとしています。これまで、Spring-Data のクエリ派生メカニズムを使用してメソッド名から N1QL クエリを構築しようとすることで苦労してきました。

これは、私のリポジトリ インターフェイス定義にあるもので、問題は findBy... 行にあります。

public interface MetricsRepository extends CrudRepository<Single, String> {
    Single save(Single entity);
    Single findOne(String id);
    List<Single> findByServiceID(long serviceId);
}

そのメソッド定義を除外すると、アプリケーションは問題なく起動します。これを含めると、次のエラーが原因でリポジトリ Bean の作成に失敗します。

 Caused by: java.lang.AbstractMethodError: org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactory$CouchbaseQueryLookupStrategy.resolveQuery(Ljava/lang/reflect/Method;Lorg/springframework/data/repository/core/RepositoryMetadata;Lorg/springframework/data/repository/core/NamedQueries;)Lorg/springframework/data/repository/query/RepositoryQuery;
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:416)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:206)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:251)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:237)
    at org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactoryBean.afterPropertiesSet(CouchbaseRepositoryFactoryBean.java:96)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    ... 36 more

@Query (例: @Query("#{#n1ql.selectEntity} WHERE role = $1") を指定すると、同じエラーが発生します。

私のエンティティ定義:

import com.couchbase.client.java.repository.annotation.Id;
import com.couchbase.client.java.repository.annotation.Field;
import org.springframework.data.couchbase.core.mapping.Document;

@Document
public class Single {
    @Id private final String eventID;
    @Field private final long serviceID;
    @Field private final long metric;
    @Field private final long timestamp;
    @Field private final long previous;

     public Single(String eventID, long serviceID, long metric, long timestamp, long previous) {
        this.eventID = eventID;
        this.serviceID = serviceID;
        this.metric = metric;
        this.timestamp = timestamp;
        this.previous = previous;
     }

    public String getEventID() { return eventID; }
    public long getServiceID() { return serviceID; }
    public long getMetric() { return metric; }
    public long getTimestamp() { return timestamp; }
    public long getPrevious() { return previous; }
}

REST コントローラーで @Autowired アノテーションを介してリポジトリを使用しています。@Configuration および @EnableCouchbaseRepositories 構成クラス @Import を @SpringBootApplication に持っています。私のテスト インスタンスには Couchbase Server 4.0.0 コミュニティ バージョンがインストールされています。n1ql クエリがそこにない場合は、エンティティに接続して保存し、取得できます。

gradle での私の依存関係:

dependencies {
    compile("org.springframework.data:spring-data-couchbase:2.1.1.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-actuator")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("junit:junit")
}
4

2 に答える 2

1

そこで、依存関係の検出作業を少し行いました。

  • Spring Boot 1.3.3 は、バージョン1.7.4( Gosling SR4)の Spring Data BOM を参照します。
  • そのバージョンの Spring Data BOM が をもたらしspring data-couchbase 1.4.4ます。あなたがしたように、バージョンを強制しない限り、それが得られるものです。
  • しかし、あなたの問題の根本は、それがもたらすことですspring-data-commons 1.11.4(もちろん、BOMは一貫したバージョンのセットをバンドルするように作られているため)

そのため、Spring Data Commons を選択するために BOM に依存しながら、Spring Data Couchbase 依存関係のみのバージョンを強制することになり、互換性のないアーティファクトが発生します。

少し悪いニュースがあります。Spring Data Couchbase 2.x (新しい「世代」) が必要な場合、それは でのみ公式にサポートされていSpring Data Hopperます。およびHopperは、** でのみ公式にサポートされておりSpring Boot 1.4.0、** は現在 MILESTONE 2 にあります。

Spring Data Couchbase 2.x だけを使い始めたい場合は、Spring Boot 1.4.0.M2 を使用しても問題ないでしょうか?

2.x バージョンをあまり気にしない場合は、Gradle 構成でバージョンを削除するだけで動作するはずです。

DANGER ZONE : Spring Boot 1.3.3 内で Spring Data Couchbase 2.1.1 を絶対に実行したい場合は、依存関係が衝突すると何かが壊れる可能性があることに注意してください。とはいえ、Couchbase データ ストアのみを使用する場合は、おそらく問題ありません。BOM をインポートするにはプラグインが必要なため、Gradle でこれを行う方法は複雑です。この要点を見てください。

プロジェクト サイトを更新して、通常はバージョンを強制するよりも BOM を優先する必要があることに注意してください。そこにあるクイック スタートは、スタンドアロン プロジェクト用です。

于 2016-05-11T16:55:37.213 に答える