带有弹簧数据的Neo4j - 暴露用@GraphId标记的字段

时间:2017-02-16 16:36:13

标签: java neo4j spring-data-neo4j-4

我尝试将neo4j与spring数据@RepositoryRestResource一起使用,但在返回的json中没有" id"领域。如何改变这种行为?

示例输出:

{
  "_embedded" : {
    "movies" : [ {
      "name" : "movie1",
     },
   ...
}

我的实体:

@NodeEntity
public class Movie {

    @GraphId
    Long id;

    String name;

    // getters and setters omitted for brevity
}

我的回购:

@RepositoryRestResource(collectionResourceRel = "movies", path = "movies")
public interface MovieRepo extends GraphRepository<Movie> { }

2 个答案:

答案 0 :(得分:0)

它似乎是Spring Data REST的默认设置。下面列出的配置有帮助,id在JSON中可见。

@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Movie.class);
    }
}

我还注意到@RestController的工作方式不同并且始终打印id,无论是否在配置中公开,可能是因为它不是Spring Data REST包的一部分

答案 1 :(得分:0)

您可能想重新考虑在REST响应中公开基于Neo4j的ID ...可能有一个原因,SDR创建者默认情况下不包含实体的ID。

对于Neo4j和应用程序视图,暴露和使用Neo4j内部id是安全的,因为应用程序中的任何内容都不会因使用它们而中断。

也就是说,Neo4j内部id被循环使用,我的意思是,如果节点或关系的内部id为12345,并且在某些时候删除了节点或关系,则12345的id有资格被未来的节点重用或关系。我认为明智地假设新的id将在未来的某个时候重用。这具有负面影响,即Neo4j内部id不被认为是“稳定的”,不应在您的应用程序之外使用。

至于一个新的代理键的例子,我会指向GraphAware的https://github.com/graphaware/neo4j-uuid的neo4j-uuid项目。此Neo4j插件可用于在所有节点和关系上自动创建唯一且稳定的UUID,这些UUID将不会也不会被更改或更新。