2015-12-15 37 views
1

,我发现了以下异常:库使用N1QL

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'answerRepository': Invocation of init method failed; nested exception is org.springframework.data.couchbase.core.UnsupportedCouchbaseFeatureException: Repository uses N1QL 

我使用Spring 4.2.0.RELEASE与弹簧数据couchbase 2.0.0.M1对Couchbase 2.5.1企业版( build-1083)

我看不出有关此错误的文档中的任何解释。

这里是仓库:

public interface AnswerRepository extends BaseRepository<Answer, String> { 

    final static String DESIGN_DOCUMENT = "answers"; 

    @View(viewName = "answers_by_quizId_startTime", designDocument = DESIGN_DOCUMENT) 
    public List<Answer> findByQuizIdAndStartTime(String quizId, long startTime); 

    Answer findByUuid(String uuid); 

} 

@NoRepositoryBean 
public interface BaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { 
} 

也许我的Couchbase服务器不支持此功能,而我的仓库期待它。

我可能需要以不同的方式对我的存储库进行编码。

这太糟糕了,没有说哪种方法是无效的。

或者它是我在基类中使用CrudRepository?

我不知道如何找出它希望在我的Couchbase服务器中找到哪些视图。

回答

2

Spring数据库Couchbase 2.0几乎完全依赖于ViewsN1QL。这个版本中的一大部分新功能都是由N1QL实现的,它现在是Spring Data用于“查询派生”的默认机制(通过生成某种从方法名派生的查询来实现储存库方法)。

Couchbase Server 2.5.1没有获得N1QL(与Couchbase服务器来4.0,当然也是在全新的4.1版本)。

如果您希望Spring Data为您实施findByUuid,则必须使用@View注释该方法,并创建从Answer文档发出uuids的相应视图。

查看查询的推导是严格限制,给你更多的工作,因为你必须写正确map function

  • 存储库方法基于视图只能与一个标准查询。
  • 你必须正确地创建你的视图,发出正确的关键字对应你将要查询的标准。
  • 您必须创建每个实体类的一个视图,限制视图仅在JSON中的“_class”字段与所述实体匹配时发出(注意:此字段可以在配置中重命名,因此请确保使用相关的)。

因此,这意味着你的findByQuizIdAndStartTime不能工作,要么。您可能必须在BaseRepository中实施(也可能为findByUuid),依赖于CouchbaseTemplate并使用其方法findByView(或甚至queryView作为最后的手段)。

UnsupportedCouchbaseFeatureException在M1文档第7章(在N1QL based querying上)中提及。

另请参阅关于view query derivation的文档。

+0

我还可以使用这些版本的Couchbase 2.5.1和SDC 2.0.0.M1从CrudRepository类中获益吗?说如果我修复存储库方法。或者我必须恢复到较旧的SDC版本。现在我得到一个'java.lang.StackOverflowError:null'异常,如果我在我的测试中做了一个'answer0 = answerRepository.save(answer0);'。 – Stephane