我正在编写Spring Restful微服务,它依赖于Spring Data Rest和Spring Data Neo4J。
我们不希望在JSON响应的HAL链接中公开内部Neo4J节点标识符。原因(据我所知),在节点删除的情况下,Neo4J会重用这些标识符。如果是这种情况,这将向我们提出数据完整性问题。所以我们宁愿使用自然键,例如UUID。 如果我关于重新使用neo4J节点ID的假设错误,请纠正我。
我们想要实现的是为所有CRUD操作使用自然键而不是节点Id(即:PUT http://localhost:8080/apiname/5448ae86-fe87-4daf-bfb5-985522a1cf14与某个身体)。
我们的第一种方法是扩展 NodeGraphRepositoryImp 。例如。
protected Node getById(UUID id) {
Node node = (Node) this.findByPropertyValue("uuid_id", id);
return template.getNode(node.getId());
}
通过在Neo4J配置中注入自定义 Neo4jTemplate 来实例化它。
然而,由于以下原因,这种方法不起作用:
1)我无法定义任何其他 idProperty 与 NodeEntity 类中使用 @GraphId 注释的 idProperty 不同。因此,Spring Data Rest最终尝试将自然密钥(例如UUID)分配给neo4j节点id字段(即Long),并在类型转换时失败。
2)似乎Spring Data Neo4J没有使用扩展NodeGraphRepositoryImpl的自定义类,而是使用原始的非扩展NodeGraphRepositoryImpl类。
也许这种做法是错误的。你能推荐一种实现它的方法吗?
非常感谢你的帮助。
答案 0 :(得分:0)
Spring Data Rest引入了一个 BackendIdConverter ,用于覆盖/自定义在URI中公开的字段。
请查看DATAREST-155(https://jira.spring.io/plugins/servlet/mobile#issue/DATAREST-155)
你可以尝试一下吗?
您还可以查看以下主题:
How can you customise self, parent, children links in spring data rest with neo4j