Spring Data Neo4j + Spring Data Rest:使用自然密钥代替所有CRUD操作而不是Neo4J节点Id

时间:2015-02-17 16:19:13

标签: spring-data-neo4j spring-data-rest

我正在编写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类。

也许这种做法是错误的。你能推荐一种实现它的方法吗?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

Spring Data Rest引入了一个 BackendIdConverter ,用于覆盖/自定义在URI中公开的字段。

请查看DATAREST-155https://jira.spring.io/plugins/servlet/mobile#issue/DATAREST-155

你可以尝试一下吗?

您还可以查看以下主题:

How can you customise self, parent, children links in spring data rest with neo4j