Spring Boot和Spring Data Couchbase N1QL自动生成查询

时间:2016-05-09 16:41:31

标签: spring spring-boot spring-data couchbase spring-data-couchbase

我正在尝试使用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(&#34;#{#n1ql.selectEntity} WHERE role = $ 1&#34;)我得到同样的错误。

我的实体定义:

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")
}

2 个答案:

答案 0 :(得分:1)

所以我做了一些依赖性侦探工作:

  • Spring Boot 1.3.3引用版本1.7.4中的Spring数据BOM(Gosling SR4
  • 该版本的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(新的&#34;生成&#34;),它只在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数据存储,也许你可以。使用Gradle时,这样做的方法很复杂,因为您需要一个插件来导入BOM。看看this gist

我已经更新了项目网站,注意到BOM通常应该优于强制版本。这是一个独立项目的快速启动。

答案 1 :(得分:0)

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