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-ed 到@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 Couchbase 依赖项的版本,同时依赖 BOM 来选择 Spring Data Commons,从而导致不兼容的工件。

这里有个坏消息:如果你想要 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 配置中删除该版本,它应该可以工作。

危险区域:如果您绝对想在 Spring Boot 1.3.3 中执行一些 Spring Data Couchbase 2.1.1,那么请注意,如果依赖项发生冲突,任何事情都可能会中断。也就是说,如果你只使用 Couchbase 数据存储,也许你会没事的。使用 Gradle 的方法很复杂,因为您需要一个插件来导入 BOM。看看这个要点

我已经更新了项目站点,以注意 BOM 通常应该比强制版本更受青睐。快速入门适用于独立项目。

于 2016-05-11T16:55:37.213 回答
0

我在 Spring Data Couchbase 2.1.1 中遇到了同样的问题(java.lang.AbstractMethodError)。但是在这种情况下,我在项目中使用了其他依赖项,使用了不同的 Spring Commons 所需版本,它们发生了冲突。尝试使用不同的版本,也许是 2.1.0。

于 2016-05-10T16:33:12.060 回答