我正在编写一些代码,这些代码使用 spring-data-neo4j (SDN) 和 spring-data-rest-mvc 来存储和访问具有循环特征的图形数据。我正在使用 spring-data-rest-mvc 来访问 HATEOAS 功能,以允许客户通过链接来导航图形。
作为一个简单的例子,我从 http://spring.io/guides/gs/accessing-neo4j-data-rest/ 中获取了 gs-accessing-neo4j-data-rest 代码。并通过一种社交方面(即“ friend ”)增强了 Person 类:
@RelatedTo(type = "FRIENDS_WITH", direction = Direction.BOTH)
Set<Person> friends = new HashSet<Person>();
即Person 实例之间的双向关系。
我加载了一组示例数据并在它们之间建立了随机 friend 关系。到目前为止一切都很好。
如果我打
http://localhost:8080/people/408
我得到了预期的结果:
{
"firstName" : "Remona",
"lastName" : "Heier",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/408"
},
"friends" : {
"href" : "http://localhost:8080/people/408/friends"
}
}
}
如果我打
http://localhost:8080/people/408/friends
但是,我明白了
{
"_embedded" : {
"people" : [ {
"firstName" : null,
"lastName" : null,
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/189"
},
"friends" : {
"href" : "http://localhost:8080/people/189/friends"
}
}
}, {
"firstName" : null,
"lastName" : null,
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/34"
},
"friends" : {
"href" : "http://localhost:8080/people/34/friends"
}
}
}
}
}
其中包含 firstName 和 lastName 的空值。
直接攻击其中一个 friend ,例如
http://localhost:8080/people/189
我得到:
{
"firstName" : "Zita",
"lastName" : "Speltz",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/189"
},
"friends" : {
"href" : "http://localhost:8080/people/189/friends"
}
}
}
我明白为什么我得到的是空值—— friend 集上没有@Fetch,所以实际上并没有获取 friend ——只有节点 ID 是已知的,它用于构建 self 和 friend href。但是使用空值生成的输出是错误的 - 这是对数据的错误陈述。
我不能在 friends Set 上包含 @Fetch,因为这会使应用程序陷入旋转并溢出堆栈,所以这就是我遇到的问题。我想查看列出好友时显示的好友的非关系属性,即我想查看:
{
"_embedded" : {
"people" : [ {
"firstName" : "Zita",
"lastName" : "Speltz",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/189"
},
"friends" : {
"href" : "http://localhost:8080/people/189/friends"
}
}
}, {
"firstName" : "Ciara",
"lastName" : "Cobbley",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/34"
},
"friends" : {
"href" : "http://localhost:8080/people/34/friends"
}
}
}
}
}
有谁知道我怎样才能做到这一点?
非常感谢。
请您参考如下方法:
这似乎是 spring-data 或 spring-data-rest 中的错误。我在使用 spring-data-rest 2.3.0 和 spring-data-jpa 的延迟获取实体上遇到了同样的事情。我能够获得所需输出(即实际显示的实体信息)的唯一方法是急切地获取相关实体。你说你不能那样做,所以我看到的唯一选择是让你编写自己的 Controller 来返回正确的数据。您只需要覆盖引用实体的 requestMappings,因为 spring-data-rest Controller 仍将处理您的 Controller 不处理的任何 requestMappings。 spring-restbucks 项目在这里有一个自定义 Controller 的例子:
您需要添加一个方法来处理“/people/{id}/friends”请求映射,并使用数据和链接自行填充资源。