neo4j 电影示例返回格式错误 json

neo4j movies example returning malformed json

我正在尝试设置在 https://neo4j.com/developer/example-project/

中找到的 Spring Data Neo4j 4 neo4j 电影示例

代码的 link 位于 https://github.com/neo4j-examples/movies-java-spring-data-neo4j-4

我已经在本地准备好一切并 运行ning。三个组件中的两个正在运行,电影列表和背景图。不起作用的是在右侧显示单个电影。

此信息从以下代码开始填充
index.html(从第 82 行开始):

<script type="text/javascript">
    $(function () {
        function showMovie(title) {
            $.get("/movies/search/findByTitle?title=" + encodeURIComponent(title), // todo fix paramter in SDN
                    function (data) {
                        if (!data ) return; //  || !data["_embedded"].movies) return;
                        var movie = data; // ["_embedded"].movies[0];
                        $("#title").text(movie.title);
...
                    });
                }, "json");
        return false;
    }
...
</javascript>

函数 function (data) 未被调用。

http://localhost:8080/movies/search/findByTitle?title=The%20Matrix%20Reloaded 是 returning 以下格式错误的 JSON:

{
  "title" : "The Matrix Reloaded",
  "released" : 2003,
  "tagline" : "Free your mind",
  "roles" : [ {
    "roles" : [ "Morpheus" ],
    "person" : {
      "name" : "Laurence Fishburne",
      "born" : 1961
                    },
    "movie" : { : 9
    }
  }, {
    "roles" : [ "Agent Smith" ],
    "person" : {
      "name" : "Hugo Weaving",
      "born" : 1960
    },
    "movie" : { : 9
    }
  }, {
    "roles" : [ "Trinity" ],
    "person" : {
      "name" : "Carrie-Anne Moss",
      "born" : 1967
    },
    "movie" : { : 9
    }
  }, {
    "roles" : [ "Neo" ],
    "person" : {
      "name" : "Keanu Reeves",
      "born" : 1964
    },
    "movie" : { : 9
    }
  } ],
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/movies/9"
    },
    "movie" : {
      "href" : "http://localhost:8080/movies/9"
    }
  }
}

未正确填充 ID。我正在尝试 运行 这个例子来开始学习 spring-boot 和 neo4j,我不确定为什么代码没有 return 正确的数据结构?

neo4j 查询有一个日志条目:

MATCH (n:`Movie`) WHERE n.`title` = { `title_0` } WITH n MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n) with params {title_0=The Matrix Reloaded}

我 运行 在 neo4j 控制台中查看了输出的文本:

╒══════════════════════════════╤═══════╕
│"p"                           │"ID(n)"│
╞══════════════════════════════╪═══════╡
│[]                            │"9"    │
├──────────────────────────────┼───────┤
│[{"tagline":"Free your mind","│"9"    │
│title":"The Matrix Reloaded","│       │
│released":"2003"},{"roles":["A│       │
│gent Smith"]},{"born":"1960","│       │
│name":"Hugo Weaving"}]        │       │
├──────────────────────────────┼───────┤
│[{"tagline":"Free your mind","│"9"    │
│title":"The Matrix Reloaded","│       │
│released":"2003"},{"roles":["M│       │
│orpheus"]},{"born":"1961","nam│       │
│e":"Laurence Fishburne"}]     │       │
├──────────────────────────────┼───────┤
│[{"tagline":"Free your mind","│"9"    │
│title":"The Matrix Reloaded","│       │
│released":"2003"},{"roles":["T│       │
│rinity"]},{"born":"1967","name│       │
│":"Carrie-Anne Moss"}]        │       │
├──────────────────────────────┼───────┤
│[{"tagline":"Free your mind","│"9"    │
│title":"The Matrix Reloaded","│       │
│released":"2003"},{"roles":["N│       │
│eo"]},{"born":"1964","name":"K│       │
│eanu Reeves"}]                │       │
└──────────────────────────────┴───────┘

看起来问题出在这个额外的 ID(n) 列上。我不知道为什么要添加它,或者如何让它不被添加。我能看到的唯一会生成密码的代码来自 MovieRepository.java

Movie findByTitle(@Param("title") String title);

这是版本问题还是其他问题?我怎样才能让它不 return ID(n) 列,或者 return 它具有适当的 id:9 结构?

我能够得到一个具有相同结构的不同示例: https://github.com/springframeworkguru/spring-boot-neo4j-example 然后修改它来做我原来的例子试图做的事情。然后,我能够比较两个项目之间的差异,将差异应用到原始项目并使其正常运行。 以下是使其正常工作的所有代码差异:

index.html(第 105 行)注释掉不需要的行

(105)                    //data = data["_embedded"].movies;

MovieService.java 添加到文件

    public Movie getByTitle (String title){ return movieRepository.findByTitle (title); }

    public Collection<Movie> getByTitleContaining(String title) {
        return movieRepository.findByTitleContaining (title);
    }

MovieController.java 添加到文件

    @RequestMapping("/movies/search/findByTitle")
    public Movie findByTitle(@RequestParam String title){
        return movieService.getByTitle(title);
    }

    @RequestMapping("/movies/search/findByTitleContaining")
    public Collection<Movie> findByTitleContaining(@RequestParam String title){
        return movieService.getByTitleContaining(title);
    }

MovieRepository.java(第 9 和 15 行)删除或注释掉

(9)  //import org.springframework.data.rest.core.annotation.RepositoryRestResource;
...
(15) //@RepositoryRestResource(collectionResourceRel = "movies", path = "movies")

pom.xml 为了便于阅读,我把整个文件放在这里

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.neo4j.examples</groupId>
    <artifactId>sdn4-movies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>SDN4 University</name>
    <description>Demo web project for Spring Boot using Spring Data Neo4j</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository --> <!-- added -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-neo4j</artifactId>
            <!--<version>4.2.0.RELEASE</version>-->
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <!--<artifactId>spring-boot-starter-data-neo4j</artifactId>-->
        </dependency>

        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-ogm-bolt-driver</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-data-rest</artifactId>-->
        <!--</dependency>-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- For some reason newer versions of jackson cause errors with -->
        <!-- serialisation of nested objects in graph -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.0</version>
            <!--<version>2.5.5</version>-->
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.6</version>
            <!--<version>2.5.5</version>-->
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.6</version>
            <!--<version>2.5.5</version>-->
        </dependency>
        <!-- ========================================== -->

        <!-- For use in testing -->
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-ogm-embedded-driver</artifactId>
            <version>2.1.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>3.1.1</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

此问题已于今天修复:https://github.com/neo4j-examples/movies-java-spring-data-neo4j-4

您无需更改任何代码。它会起作用的。

请注意,目前这需要使用 SDN 4.2.2 SNAPSHOT 版本。一旦 Boot 和 Spring Data 发布下一个服务版本,我们将更新项目以删除这些。