当前位置: 首页 > 知识库问答 >
问题:

Spring Boot和Spring数据Couchbase N1QL自动生成的查询

舒仲渊
2023-03-14

我正在尝试使用Spring启动和Spring数据沙发库项目创建一个简单的原型。到目前为止,我一直试图使用Spring数据的查询派生机制从方法名称构建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注释使用存储库。我在@SpringBootApplication中有一个@Configuration和@EnableCouchbaseRepositories配置类@Import。我的测试实例上安装了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个答案

储嘉悦
2023-03-14

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

闻人业
2023-03-14

所以我做了一些依赖性的调查工作:

  • Spring启动 1.3.3 是指版本 1.7.4高斯林 SR4) 中的Spring数据 BOM
  • 该版本的Spring数据BOM引入了Spring数据沙发库1.4.4。这就是你会得到的,除非你像你一样强制版本。
  • 但是,您问题的根源在于它还带来了Spring数据共享1.11.4(当然,因为BOM是用来捆绑一组连贯的版本)

因此,您最终强制使用仅使用Spring数据Couchbase依赖项的版本,同时依靠BOM来选择Spring数据共享,从而导致不兼容的伪影。

这里有一个坏消息:如果你想要Spring数据Couchbase 2.x(新的“一代”),它只在Spring数据跳跃器中得到官方支持。而 Hopper 仅在 Spring Boot 1.4.0 中正式受支持,该版本 **目前在里程碑 2 中。

如果你只想开始玩Spring数据沙发库2.x,也许使用Spring启动1.4.0.M2是可以接受的?

如果您并不真正关心2. x版本,您应该简单地删除Gradle配置中的版本,它应该可以工作。

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

我已经更新了项目站点,注意到BOM通常应该比强制版本更受欢迎。快速启动是针对独立项目的。

 类似资料:
  • 如果我使用MySQL,我的实体和枚举将成功创建。 我将数据库更改为PostgreSQL-9.4。因此,我有以下错误: ...原因:org.hibernate.tool.schema.spi.SchemaManagementException:无法对JDBC目标执行架构管理[创建表角色(id int8 not null,name enum('ADMIN','USER','SEARCH')not nu

  • 当应用程序启动时,我正在尝试创建mysql数据库。我尝试了波纹管配置,但无法实现,如果有人对此有想法,请告诉我,

  • 我想用springboot项目生成MySQL数据库。我创建了一个maven项目,这是pom.xml:

  • 本文向大家介绍springboot+mybatis通过实体类自动生成数据库表的方法,包括了springboot+mybatis通过实体类自动生成数据库表的方法的使用技巧和注意事项,需要的朋友参考一下 前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表。 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 添加数据库配置文件ap

  • 本文向大家介绍SpringBoot+Swagger-ui自动生成API文档,包括了SpringBoot+Swagger-ui自动生成API文档的使用技巧和注意事项,需要的朋友参考一下 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染、先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。 这样后段开发好了api 之后就要提交api 文档给前端的朋友。给前端的a

  • 我目前正在将我所做的一个项目从使用Hibernate的Spring Data转换为使用ElasticSearch的Spring Data。 以前,我能够使用注释自动生成实体的id。这样,当实体被保存时,就会为它生成一个id号。 使用Hibernate注释的实体: 是否存在与@GeneratedValue注释等价的ElasticSearch?如果不是,使用ElasticSearch时填充id字段的最