【问题标题】:Spring Data Neo4j Repository Composition error: No property XXXX found for type YYYYSpring Data Neo4j 存储库组合错误:找不到类型 YYYY 的属性 XXXX
【发布时间】:2014-05-08 16:49:16
【问题描述】:

这应该是一个关于 Spring Data 文档中我可能遗漏的内容的简单问题。

我正在尝试实现如下所述的存储库扩展:http://docs.spring.io/spring-data/data-neo4j/docs/3.0.2.RELEASE/reference/html/programming-model.html#d0e2970

代码非常简单。我只有一个存储库和一个扩展接口(和实现)。

首先是MyType 类的存储库:

public interface MyTypeRepository extends 
        GraphRepository<MyType>, MyTypeRepositoryExtension { }

然后是扩展接口:

public interface MyTypeRepositoryExtension {
    void anyMethodNameForQuery();
}

及其实现:

public class MyTypeRepositoryExtensionImpl {

     public void anyMethodNameForQuery() {
          //custom query code
     }
 }

使用此代码,Spring Data 在引导其映射基础架构时会引发错误:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property any found for type MyType!

正如我从这个错误中了解到的那样,添加到扩展接口 Spring Data 的任何方法都会尝试映射到相应类型的属性。但这是存储库扩展的唯一用途吗?这不是我从文档中理解的(上面链接)。如果这是真的,自定义查询的替代方案是什么?

最后的观察是我知道@Query 注释,但我的用例需要特定的遍历和动态查询组合。


编辑:更多信息

再次查看文档,我发现了一些可能与此相关的信息。为了配置存储库组合,有必要将存储库扫描路径从org.example.repository 更改为org.springframework.data.neo4j。这就是为什么我在 MyTypeRepositoryExtension 接口 Spring Data 中放置的任何方法都试图映射到 MyType 属性。

我已将 Spring Data Neo4j 存储库扫描路径设置为记录,但我有许多运行时类未找到错误,例如:java.io.FileNotFoundException: class path resource [javax/enterprise/inject/spi/Extension.class] cannot be opened because it does not exist"

以一种尝试和错误的方式,我设法找到了一些可以填补缺失类的依赖项。我最终得到了这些依赖项:

    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
        <version>3.3.3</version>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-lucene4</artifactId>
        <version>3.3.3</version>
        <optional>true</optional>
        <exclusions>
            <exclusion>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>3.3.3</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.0-SP1</version>
    </dependency>

这消除了类未找到错误,但现在,由于我更改了存储库路径,Spring 无法注入存储库。

我认为文档试图对此发表一些看法,但我无法理解短语中的“把它放在后面”是什么意思(来自文档):“如果你在 spring 配置中使用 &lt;context:component-scan&gt; ,请确保将其放在&lt;neo4j:repositories&gt; 后面,因为 RepositoryFactoryBean 会为所有声明的存储库添加新的 bean 定义,否则上下文扫描不会拾取它们”

总而言之,我真的需要一些指导 :-) ...另外,我认为文档需要定义所需的依赖项。并描述如何在项目中混合扩展存储库和标准存储库(仅限接口)。

【问题讨论】:

  • 嗨@pasemes!这个问题有什么进展吗?我正在为同样的问题苦苦挣扎(见question)?你有正确的配置吗?谢谢

标签: java spring spring-data-neo4j


【解决方案1】:

我知道一年后答案可能对你没有用,但也许可以帮助那些在 spring-data-neo4j 上苦苦挣扎的人,比如我这些天(见 question

只需指出你需要改变的两点:

1) 遵循spring-data 存储库命名约定,自定义存储库的实现名称必须为EntityRepsitoryImpl(尽管可以通过配置更改默认后缀 Impl)。因此,您需要将MyTypeRepositoryExtensionImpl 更改为MyTypeRepositoryImpl

2) 您不需要更改neo4j:repositories 包。 org.example.repository 很好。 不要使用org.springframework.data.neo4j

3) 关于所需的依赖关系,如果您不更改第 2 点中提到的包存储库,那么基础知识就足够了:

  • org.springframework.data.spring-data-neo4j
  • javax.validation.validation-api
  • com.sun.jersey.jersey-client

我同意你的观点,spring-data-neo4j 存储库组合有点混乱,网上也很少有好的例子......所以,最后我决定在 GitHub 上创建一个示例项目,并用一个基本示例展示我们如何可以的。

希望它在未来对其他人有所帮助。

GitHub:neo4jCustomRepository

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 2013-06-01
    • 2017-09-19
    • 2014-03-18
    • 2012-12-06
    • 2017-05-18
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多