Spring Data Neo4j存储库组合错误:找不到类型为YYYY的属性XXXX

时间:2014-05-08 16:49:16

标签: java spring spring-data-neo4j

这应该是一个关于我可能在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无法注入存储库。

文档试图说出我想的一些事情,但我无法理解&#34;把它放在后面&#34;在短语中(来自文档):&#34;如果在spring配置中使用<context:component-scan>,请确保将其放在<neo4j:repositories>之后,因为RepositoryFactoryBean添加了新的bean定义对于所有已声明的存储库,上下文扫描不会选择它们,否则&#34;

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

1 个答案:

答案 0 :(得分:0)

我知道一年之后可能答案对你没有用,但也许可以帮助其他与<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Entries"> <xs:complexType> <xs:sequence> <xs:element name="Organization" maxOccurs="unbounded" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="RelatedTo"> <xs:complexType> <xs:sequence> <xs:element name="Group"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="MemberName" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute type="xs:string" name="RelationType" use="optional"/> </xs:complexType> </xs:element> <xs:element name="MemberInfo"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="DynamicEntryType" use="optional"/> <xs:attribute type="xs:string" name="InfoType" use="optional"/> <xs:attribute type="xs:string" name="InternalSOR" use="optional"/> <xs:attribute type="xs:string" name="PaymentMethod" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="MemberStatus"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="StatusEnumValue" use="optional"/> <xs:attribute type="xs:date" name="EffectiveStartDate" use="optional"/> <xs:attribute type="xs:date" name="EffectiveEndDate" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="Address"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="ImportAction" use="optional"/> <xs:attribute type="xs:string" name="AddrType" use="optional"/> <xs:attribute type="xs:string" name="AddrLine1" use="optional"/> <xs:attribute type="xs:string" name="AddrLine2" use="optional"/> <xs:attribute type="xs:string" name="AddrCity" use="optional"/> <xs:attribute type="xs:string" name="AddrState" use="optional"/> <xs:attribute type="xs:string" name="AddrZip" use="optional"/> <xs:attribute type="xs:string" name="AddrCountry" use="optional"/> <xs:attribute type="xs:string" name="AddrFlags" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="AssociatedToOrg"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="Name" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="OrganizationId"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="ImportAction" use="optional"/> <xs:attribute type="xs:string" name="Type" use="optional"/> <xs:attribute name="Identifier"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:pattern value="[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute type="xs:string" name="Primary" use="optional"/> <xs:attribute type="xs:date" name="StartDate" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute type="xs:string" name="MemberName" use="optional"/> <xs:attribute type="xs:string" name="Comments" use="optional"/> <xs:attribute type="xs:string" name="FullName" use="optional"/> <xs:attribute type="xs:string" name="OrgIdType" use="optional"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> 挣扎的人,就像我这些天一样(见question

只需指出需要改变的两件事:

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

MyTypeRepositoryExtensionImpl

2)您无需更改MyTypeRepositoryImpl包。 neo4j:repositories没问题。 不要使用org.example.repository

3)关于所需的依赖关系,如果你没有像第2点中提到的那样更改软件包存储库,那么基础就足够了:

  
      
  • org.springframework.data.spring - 数据 - 的Neo4j
  •   
  • javax.validation.validation-API
  •   
  • com.sun.jersey.jersey的客户端
  •   

我同意你的观点,org.springframework.data.neo4j存储库组成有点令人困惑,网上很少有很好的例子......所以,最后我决定在GitHub上创建一个示例项目,基本示例显示我们该怎么做。

希望将来帮助其他人。

请参阅spring-data-neo4jneo4jCustomRepository