【问题标题】:Spring Data Couchbase problems with indexesSpring Data Couchbase 索引问题
【发布时间】:2019-01-31 23:02:16
【问题描述】:

我正在玩沙发底座和弹簧数据沙发底座。为此,我安装了版本为5.5.1 build 3511 的couchbase 并启用了测试桶。我用密码beer-sample 创建了用户beer-sample,并将他的所有权限添加到存储桶beer-sample

然后我创建了 this sample application 并配置了 couchbase。当我启动应用程序和query 用于桶中现有的啤酒时,我遇到了异常:

com.couchbase.client.java.error.ViewDoesNotExistException: View beer/all does not exist.
    at com.couchbase.client.java.view.ViewQueryResponseMapper$BuildViewResult.call(ViewQueryResponseMapper.java:211)
    at com.couchbase.client.java.view.ViewQueryResponseMapper$BuildViewResult.call(ViewQueryResponseMapper.java:185)
    at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:69)
    at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
    at rx.internal.producers.SingleProducer.request(SingleProducer.java:65)
    at rx.Subscriber.setProducer(Subscriber.java:211)
    at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
    at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
    at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:113)
    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:281)
    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:216)
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: rx.exceptions.OnErrorThrowable$OnNextValue: OnError while emitting onNext value: com.couchbase.client.java.document.json.JsonObject.class
    at rx.exceptions.OnErrorThrowable.addValueAsLastCause(OnErrorThrowable.java:118)
    at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:73)
    ... 16 more

我猜应该使用我的配置自动创建索引,但也许我错了。

【问题讨论】:

  • 您似乎在尝试使用视图。视图是一项古老的技术,在大多数情况下都将被淘汰。请改用 N1QL。 N1QL 至少需要一个主索引才能让大多数查询正常工作,并且需要专门的索引才能让大多数查询正常运行。

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


【解决方案1】:

您在 BeerRepository 中使用 Spring 的 couchbase 存储库接口。接口的findAll() 方法需要一个Couchbase View 来获取数据。因此,您需要在 couchbase 中手动创建视图,或者可以使用 @ViewIndexed(designDoc = "beer", viewName = "all") 注释您的 BeerRepository 接口,如果视图不存在,则会自动创建视图。

您犯的错误是用@ViewIndexed 注释您的Beer 类,因为该注释应该用于您的存储库接口。更多关于注解here的信息。

话虽如此,您还应该查看利用 Couchbase 的 N1QL 查询从 Couchbase 访问数据。您可以在存储库方法上使用 @Query 注释来实现相同的目的。有关使用 @Query 注释 here 的更多信息。

【讨论】:

  • 谢谢,当我将索引注释移动到存储库时,它解决了我的问题。但是我无法查询该数据,因为 spring 使用的是 java 类的 fqn。我没有找到方法如何告诉 spring 如何映射 type/_class 的值。
  • @bilak 对不起,我没听懂你说的。您的意思是您无法使用 findAll() 检索数据吗?能否请您详细说明,以便我可以提供帮助。
  • 不,我只想将 _class 归档更改为 type。这我知道如何覆盖typeKey() 方法。但是我不清楚如何将此字段中的值从com.gitub.bilak.beersample.persistence.couchbase.model.Beer 更改为beer。也许this PR 解决了这个问题。
  • 好朋友@MadhuBhat
  • 谢谢@PradeepKrKaushal :)
猜你喜欢
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2019-07-29
  • 1970-01-01
  • 2016-09-30
  • 2018-03-01
相关资源
最近更新 更多