MappingException:将 GraphModel 映射到实例时出错
MappingException: Error mapping GraphModel to instance
我正在尝试使用 SDN 4.0.0.M1 和 Spring引导学习 Spring 和 Neo4j 来关注 new Cineasts 应用程序,但是当我尝试访问电影 url
curlhttp://localhost:8080/movies
MappingException:将 GraphModel 映射到实例时出错
我实现了最低限度的工作,所以代码很简单,但我可能忘记了什么
电影class
@NodeEntity
public class Movie {
@GraphId
private Long nodeId;
private String id;
private String title;
public Movie() {
}
public Movie(String id, String title) {
this.id = id;
this.title = title;
}
}
关联的 MovieRepository 目前为空
public interface MovieRepository extends GraphRepository<Movie> {
}
电影控制器
@Autowired
private MovieRepository movieRepository;
@Autowired
private Session session;
@RequestMapping(value = "/movies/{id}", method = RequestMethod.GET, headers = "Accept=application/json")
public
@ResponseBody
Movie getMovie(@PathVariable String id) {
return IteratorUtil.firstOrNull(findMovieByProperty("id", id));
}
public Iterable<Movie> findMovieByProperty(String propertyName, Object propertyValue) {
return session.loadByProperty(Movie.class, new Property(propertyName, propertyValue));
}
和主 class 与数据库连接
@SpringBootApplication
@EnableNeo4jRepositories("cineasts.repository")
@EnableTransactionManagement
public class CineastsApplication extends Neo4jConfiguration {
public static final int NEO4J_PORT = 7474;
@Bean
public Neo4jServer neo4jServer() {
return new RemoteServer("http://localhost:" + NEO4J_PORT);
}
@Override
public SessionFactory getSessionFactory() {
return new SessionFactory("org.neo4j.cineasts.domain");
}
@Override
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
return super.getSession();
}
public static void main(String[] args) {
SpringApplication.run(CineastsApplication.class, args);
}
}
我启动了 Neo4j 并使用 Neo4j 浏览器添加了一条记录
CREATE (m:Movie {id:1, name:'The Matrix'}) return m
当我转到 localhost:8080 时,我可以看到 json 响应
{
"_links" : {
"movies" : {
"href" : "http://localhost:8080/movies"
},
"profile" : {
"href" : "http://localhost:8080/alps"
}
}
但它无法显示我刚创建的电影或 http://localhost:8080/movies/1 记录。有解决此问题或获得更相关消息的想法吗?
谢谢!
问题可能是您的实体定义与您创建的节点的实体定义不匹配。
Movie class 定义了数据类型 String 的 属性 id
和 String 类型的 属性 title
。
不过您使用的 Cypher
CREATE (m:Movie {id:1, name:'The Matrix'}) return m
创建一个节点,其中包含数字 ID 而不是字符串 ID,名称 属性 而不是标题 属性。
将上面的内容改为
CREATE (m:Movie {id:'1', title:'The Matrix'}) return m
应该修复它。
我正在尝试使用 SDN 4.0.0.M1 和 Spring引导学习 Spring 和 Neo4j 来关注 new Cineasts 应用程序,但是当我尝试访问电影 url curlhttp://localhost:8080/movies
MappingException:将 GraphModel 映射到实例时出错
我实现了最低限度的工作,所以代码很简单,但我可能忘记了什么
电影class
@NodeEntity
public class Movie {
@GraphId
private Long nodeId;
private String id;
private String title;
public Movie() {
}
public Movie(String id, String title) {
this.id = id;
this.title = title;
}
}
关联的 MovieRepository 目前为空
public interface MovieRepository extends GraphRepository<Movie> {
}
电影控制器
@Autowired
private MovieRepository movieRepository;
@Autowired
private Session session;
@RequestMapping(value = "/movies/{id}", method = RequestMethod.GET, headers = "Accept=application/json")
public
@ResponseBody
Movie getMovie(@PathVariable String id) {
return IteratorUtil.firstOrNull(findMovieByProperty("id", id));
}
public Iterable<Movie> findMovieByProperty(String propertyName, Object propertyValue) {
return session.loadByProperty(Movie.class, new Property(propertyName, propertyValue));
}
和主 class 与数据库连接
@SpringBootApplication
@EnableNeo4jRepositories("cineasts.repository")
@EnableTransactionManagement
public class CineastsApplication extends Neo4jConfiguration {
public static final int NEO4J_PORT = 7474;
@Bean
public Neo4jServer neo4jServer() {
return new RemoteServer("http://localhost:" + NEO4J_PORT);
}
@Override
public SessionFactory getSessionFactory() {
return new SessionFactory("org.neo4j.cineasts.domain");
}
@Override
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
return super.getSession();
}
public static void main(String[] args) {
SpringApplication.run(CineastsApplication.class, args);
}
}
我启动了 Neo4j 并使用 Neo4j 浏览器添加了一条记录
CREATE (m:Movie {id:1, name:'The Matrix'}) return m
当我转到 localhost:8080 时,我可以看到 json 响应
{
"_links" : {
"movies" : {
"href" : "http://localhost:8080/movies"
},
"profile" : {
"href" : "http://localhost:8080/alps"
}
}
但它无法显示我刚创建的电影或 http://localhost:8080/movies/1 记录。有解决此问题或获得更相关消息的想法吗?
谢谢!
问题可能是您的实体定义与您创建的节点的实体定义不匹配。
Movie class 定义了数据类型 String 的 属性 id
和 String 类型的 属性 title
。
不过您使用的 Cypher
CREATE (m:Movie {id:1, name:'The Matrix'}) return m
创建一个节点,其中包含数字 ID 而不是字符串 ID,名称 属性 而不是标题 属性。
将上面的内容改为
CREATE (m:Movie {id:'1', title:'The Matrix'}) return m
应该修复它。