Spring Data Couchbase 4.4.5中getCouchbaseOperations()问题求助
Spring Data Couchbase 4.4.5迁移:解决getCouchbaseOperations()移除后的依赖问题
Spring Data Couchbase 4.4.5官方文档明确移除了getCouchbaseOperations()方法,官方说明可通过CouchbaseTemplate或Cluster类访问原生Java SDK的所有方法。我基于Couchbase SDK 2实现的代码,已经按照相关指引迁移了弃用的DSL包,但仍面临getCouchbaseOperations()相关的依赖问题,以下是原代码及解决方案:
原问题代码
package com.acme.acmepay.config.dao; import com.acme.acmepay.config.document.paymentoption.PaymentGatewayConfiguration; import com.acme.acmepay.config.logic.paymenttemplatereportlogic.data.PaymentTemplateDataTableSearchLogicData; import com.acme.acmepay.config.repository.PaymentGatewayConfigurationRepository; import com.couchbase.client.java.Bucket; import com.couchbase.client.java.query.N1qlQuery; import com.couchbase.client.java.query.Statement; import com.couchbase.client.java.query.dsl.Expression; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.couchbase.repository.query.support.N1qlUtils; import org.springframework.stereotype.Service; import java.util.List; @Service @Slf4j public class PaymentTemplateConfigDAOImpl implements PaymentTemplateConfigDAO { @Autowired PaymentGatewayConfigurationRepository paymentGatewayConfigurationRepository; Bucket couchbaseBucket; public List<PaymentGatewayConfiguration> getPaymentTemplateSearchReportList( PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) { Statement statement = getQueryStatement(paymentTemplateDataTableSearchLogicData); log.info("N1QL Statement" + statement); //Error happen here N1qlQuery query = N1qlQuery.simple(statement); return paymentGatewayConfigurationRepository.getCouchbaseOperations().findByN1QL(query, PaymentGatewayConfiguration.class); } private Statement getQueryStatement( PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) { //Error happen here return N1qlUtils .createSelectClauseForEntity( paymentGatewayConfigurationRepository.getCouchbaseOperations().getCouchbaseBucket().name()) .from(Expression .i(paymentGatewayConfigurationRepository.getCouchbaseOperations().getCouchbaseBucket().name())) .where(paymentTemplateDataTableSearchLogicData.getSearchQuery()) .orderBy(paymentTemplateDataTableSearchLogicData.getSort()) .limit(paymentTemplateDataTableSearchLogicData.getLimit()) .offset(paymentTemplateDataTableSearchLogicData.getOffset()); } }
解决方案
1. 注入CouchbaseTemplate替代getCouchbaseOperations()
Spring Data Couchbase 4.x中,Repository不再提供getCouchbaseOperations()方法,直接注入CouchbaseTemplate来获取操作能力:
@Autowired private CouchbaseTemplate couchbaseTemplate;
2. 调整N1QL查询实现
SDK 3.x中N1qlQuery已被替换为Query类,同时findByN1QL方法对应调整为findByQuery,结合CouchbaseTemplate实现查询。
3. 替换Bucket获取方式
通过CouchbaseTemplate获取Bucket(适配SDK 3.x的API):
Bucket bucket = couchbaseTemplate.getBucket();
修改后的完整代码
package com.acme.acmepay.config.dao; import com.acme.acmepay.config.document.paymentoption.PaymentGatewayConfiguration; import com.acme.acmepay.config.logic.paymenttemplatereportlogic.data.PaymentTemplateDataTableSearchLogicData; import com.acme.acmepay.config.repository.PaymentGatewayConfigurationRepository; import com.couchbase.client.java.Bucket; import com.couchbase.client.java.query.Query; import com.couchbase.client.java.query.Statement; import com.couchbase.client.java.query.dsl.Expression; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.couchbase.core.CouchbaseTemplate; import org.springframework.data.couchbase.repository.query.support.N1qlUtils; import org.springframework.stereotype.Service; import java.util.List; @Service @Slf4j public class PaymentTemplateConfigDAOImpl implements PaymentTemplateConfigDAO { @Autowired PaymentGatewayConfigurationRepository paymentGatewayConfigurationRepository; @Autowired private CouchbaseTemplate couchbaseTemplate; public List<PaymentGatewayConfiguration> getPaymentTemplateSearchReportList( PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) { Statement statement = getQueryStatement(paymentTemplateDataTableSearchLogicData); log.info("N1QL Statement: {}", statement); Query query = Query.simple(statement); return couchbaseTemplate.findByQuery(PaymentGatewayConfiguration.class).matching(query).all(); } private Statement getQueryStatement( PaymentTemplateDataTableSearchLogicData paymentTemplateDataTableSearchLogicData) { Bucket bucket = couchbaseTemplate.getBucket(); return N1qlUtils .createSelectClauseForEntity(bucket.name()) .from(Expression.i(bucket.name())) .where(paymentTemplateDataTableSearchLogicData.getSearchQuery()) .orderBy(paymentTemplateDataTableSearchLogicData.getSort()) .limit(paymentTemplateDataTableSearchLogicData.getLimit()) .offset(paymentTemplateDataTableSearchLogicData.getOffset()); } }
额外注意事项
- 确保项目依赖的Couchbase SDK版本与Spring Data Couchbase 4.4.5兼容(需使用SDK 3.x版本)
- 若
N1qlUtils.createSelectClauseForEntity在新版本中存在调整,可直接使用DSL构建SELECT语句,或参考官方文档的查询构建方式
内容的提问来源于stack exchange,提问作者Gehan
相关产品推荐
相关产品推荐

