这应该是一个关于我可能在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; 。
总结一下,我真的需要一些方向:-) ...另外,我认为文档需要定义所需的依赖项。并描述如何在项目中混合扩展存储库和标准存储库(仅限接口)。
答案 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-neo4j
:neo4jCustomRepository