【发布时间】:2019-11-05 20:07:56
【问题描述】:
我在 Neo4 OGM 中扫描订单类时遇到问题。
采用以下最小的 Spring Data Rest + Spring Boot 应用程序:
@NodeEntity("Country")
public class Country extends CountryRevision {
}
@NodeEntity("CountryRevision")
public class CountryRevision extends RevisionEntity<CountryRevision> {
String name;
}
public abstract class RevisionEntity<T> {
@Id @GeneratedValue(strategy = UuidStrategy.class)
String id;
@Relationship
T previousRevision;
}
@RepositoryRestResource(collectionResourceRel = "countries", path = "countries")
public interface CountryRepository extends Neo4jRepository<Country, String> {}
@RepositoryRestResource(collectionResourceRel = "countryRevisions", path = "country-rev")
public interface CountryRevisionRepository extends Neo4jRepository<CountryRevision, String> {}
@SpringBootApplication
@EnableNeo4jRepositories(basePackageClasses = DemoApplication.class)
@EntityScan(basePackageClasses = DemoApplication.class)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
当 POSTING 到 /country-rev 时,我收到以下错误:
java.lang.RuntimeException: Field previousRevision not found in class com.example.demo.CountryRevision or any of its superclasses
at org.neo4j.ogm.metadata.ClassInfo.getField(ClassInfo.java:601) ~[neo4j-ogm-core-3.2.1.jar:3.2.1]
at org.neo4j.ogm.metadata.FieldInfo.readProperty(FieldInfo.java:411) ~[neo4j-ogm-core-3.2.1.jar:3.2.1]
真正奇怪的是,如果我将“Country”类名修改为其他名称,例如“Toto”,一切正常。
我调试了 OGM 的初始化方式。看起来根据类名,包含所有 OGM ClassInfos 的映射将以不同的顺序(在 DomainInfo.prepareClass() 中)进行处理,这将产生不同的结果。
我的问题是:前面的例子有什么问题吗,或者这是 OGM 中的错误?
【问题讨论】:
-
这是非常奇怪的行为,不应该发生,因为如果在扫描时添加了任何类,整个类层次结构将重新构建。将对此进行调查。我是否正确假设
@Relationship String previousRevision指向的不是String? -
是的,
previousRevision类型应该是T。但是我想确保即使它是一个简单的类型,错误仍然存在,因此在示例中为String。你想让我为此在 Github 上创建一个问题吗? -
马丁,您能否将您发布到 URL 的内容发布到 GitHub?
标签: spring-data-rest spring-data-neo4j neo4j-ogm