根本原因为 NullpointerException 的 MappingException
MappingException with root cause NullpointerException
上下文
我在本地主机上有一个 neo4j 2.3.X 运行,连接到 API 使用:
- Neo4j-OGM
- Spring开机
- Spring 安全
- Spring 讨厌
- Spring 日志记录
所有这些 运行 在 java-8-oracle JVM
上
我在 windows 和 linux 上测试过,同样的问题。
问题总结
当我在我的 api 上对每个端点(我都测试了它们)发出 GET 请求时,neo4j-ogm 引发了 MappingException:
2016-02-24 09:52:59.821 ERROR 7496 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.neo4j.ogm.exception.MappingException: Error mapping GraphModel to instance of com.bnstips.api.database.model.BnSClass] with root cause
java.lang.NullPointerException: null
at org.neo4j.ogm.session.Utils.coerceTypes(Utils.java:80) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.annotations.FieldWriter.write(FieldWriter.java:69) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.tryMappingAsSingleton(GraphEntityMapper.java:221) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.mapRelationship(GraphEntityMapper.java:258) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.mapRelationships(GraphEntityMapper.java:245) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:143) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:117) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:81) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:73) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:110) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.session.Neo4jSession.loadAll(Neo4jSession.java:97) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at com.bnstips.api.database.GenericService.findAll(GenericService.java:18) ~[classes/:na]
at com.bnstips.api.endpoint.ClassEndpoint.getClasses(ClassEndpoint.java:54) ~[classes/:na]
...
我在我自己的代码所在的第一行停止了堆栈跟踪复制,但如果需要,我可以复制整个跟踪。
我的项目像这里的第一个例子一样完成:http://neo4j.com/docs/ogm/java/stable/
所以我有一个 GenericService<T>
通过我的所有服务扩展的 CRUD 操作。
这里是ClassEndpoint.getClasses(long id)
实现:
@RequestMapping(method=RequestMethod.GET)
@ResponseBody
public Iterable<BnSClass> getClasses(){
Iterable<BnSClass> classes = this.service.findAll();
classes.forEach((c) -> {
c.createLinks();
});
return classes;
}
和 findAll 方法:
@Override
public Iterable<T> findAll() {
return session.loadAll(getEntityType(), DEPTH_LIST);//DEPTH_LIST is -1
}
最后,Class
型号:
@NodeEntity(label="Class")
public class BnSClass extends Entity<BnSClass>{
private String name;
@Relationship(type="TIP_FOR", direction="INCOMING")
@JsonIgnore private Set<Tip> tips = new HashSet<Tip>();
@Relationship(type="USED_BY", direction="INCOMING")
@JsonIgnore private Set<Build> builds = new HashSet<Build>();
...Getters and Setters ommited
}
数据库
我的数据库很简单,我可以通过简单的截图展示给你看:
:Class
个节点仅使用一个 属性: name
.
编辑:
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-api</artifactId>
<version>2.0.0-M02</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-core</artifactId>
<version>2.0.0-M02</version>
</dependency>
</dependencies>
编辑 2:
经过一些尝试,我设法摆脱了这个错误,但为此我必须将 DEPTH_ENTITY 设置为 1 但它只能修复 findAll()
查询,所以这不是解决方案,但它可能会提供一种方法找到解决方案。
好的,我找到它的出处了,让我解释一下:
BnSClass
扩展 Commentable<T>
,这里是 Commentable<T>
:
@NodeEntity
public abstract class Commentable<T> extends Rateable<T>{
@Relationship(type="COMMENTED", direction="INCOMING")
@JsonIgnore private Set<Comment> comments = new HashSet<Comment>();
public Set<Comment> getComments(){
return this.comments;
}
}
如您所见,Commentable<T>
向我的对象添加了一组 Comment
,问题来自 Comment
:
@NodeEntity
@JsonPropertyOrder({"id", "content", "score"})
public class Comment extends Commentable<Comment> implements CreationDate{
@Relationship(type="COMMENTED", direction="OUTGOING")
@JsonIgnore private Entity<?> subject;
private String content;
private long edited;
private boolean deleted = false;
@JsonIgnore private Authored authored;
}
如果我将 subject
类型设置为 Entity
原始类型,它就像一个魅力,但如果我让 Entity<?>
作为类型,它会产生这个错误。由于我 api 中的几乎所有资源都是可评论的或有一个集合,所以每次我从数据库中获取时都会发生此错误。
N.B:每个节点实体都继承自Entity<T>
,也就是neo4j-ogm指南中提供的Entity<T>
class
上下文
我在本地主机上有一个 neo4j 2.3.X 运行,连接到 API 使用:
- Neo4j-OGM
- Spring开机
- Spring 安全
- Spring 讨厌
- Spring 日志记录
所有这些 运行 在 java-8-oracle JVM
上我在 windows 和 linux 上测试过,同样的问题。
问题总结
当我在我的 api 上对每个端点(我都测试了它们)发出 GET 请求时,neo4j-ogm 引发了 MappingException:
2016-02-24 09:52:59.821 ERROR 7496 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.neo4j.ogm.exception.MappingException: Error mapping GraphModel to instance of com.bnstips.api.database.model.BnSClass] with root cause
java.lang.NullPointerException: null
at org.neo4j.ogm.session.Utils.coerceTypes(Utils.java:80) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.annotations.FieldWriter.write(FieldWriter.java:69) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.tryMappingAsSingleton(GraphEntityMapper.java:221) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.mapRelationship(GraphEntityMapper.java:258) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.mapRelationships(GraphEntityMapper.java:245) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:143) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:117) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:81) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:73) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:110) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at org.neo4j.ogm.session.Neo4jSession.loadAll(Neo4jSession.java:97) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
at com.bnstips.api.database.GenericService.findAll(GenericService.java:18) ~[classes/:na]
at com.bnstips.api.endpoint.ClassEndpoint.getClasses(ClassEndpoint.java:54) ~[classes/:na]
...
我在我自己的代码所在的第一行停止了堆栈跟踪复制,但如果需要,我可以复制整个跟踪。
我的项目像这里的第一个例子一样完成:http://neo4j.com/docs/ogm/java/stable/
所以我有一个 GenericService<T>
通过我的所有服务扩展的 CRUD 操作。
这里是ClassEndpoint.getClasses(long id)
实现:
@RequestMapping(method=RequestMethod.GET)
@ResponseBody
public Iterable<BnSClass> getClasses(){
Iterable<BnSClass> classes = this.service.findAll();
classes.forEach((c) -> {
c.createLinks();
});
return classes;
}
和 findAll 方法:
@Override
public Iterable<T> findAll() {
return session.loadAll(getEntityType(), DEPTH_LIST);//DEPTH_LIST is -1
}
最后,Class
型号:
@NodeEntity(label="Class")
public class BnSClass extends Entity<BnSClass>{
private String name;
@Relationship(type="TIP_FOR", direction="INCOMING")
@JsonIgnore private Set<Tip> tips = new HashSet<Tip>();
@Relationship(type="USED_BY", direction="INCOMING")
@JsonIgnore private Set<Build> builds = new HashSet<Build>();
...Getters and Setters ommited
}
数据库
我的数据库很简单,我可以通过简单的截图展示给你看:
:Class
个节点仅使用一个 属性: name
.
编辑:
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-api</artifactId>
<version>2.0.0-M02</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-core</artifactId>
<version>2.0.0-M02</version>
</dependency>
</dependencies>
编辑 2:
经过一些尝试,我设法摆脱了这个错误,但为此我必须将 DEPTH_ENTITY 设置为 1 但它只能修复 findAll()
查询,所以这不是解决方案,但它可能会提供一种方法找到解决方案。
好的,我找到它的出处了,让我解释一下:
BnSClass
扩展 Commentable<T>
,这里是 Commentable<T>
:
@NodeEntity
public abstract class Commentable<T> extends Rateable<T>{
@Relationship(type="COMMENTED", direction="INCOMING")
@JsonIgnore private Set<Comment> comments = new HashSet<Comment>();
public Set<Comment> getComments(){
return this.comments;
}
}
如您所见,Commentable<T>
向我的对象添加了一组 Comment
,问题来自 Comment
:
@NodeEntity
@JsonPropertyOrder({"id", "content", "score"})
public class Comment extends Commentable<Comment> implements CreationDate{
@Relationship(type="COMMENTED", direction="OUTGOING")
@JsonIgnore private Entity<?> subject;
private String content;
private long edited;
private boolean deleted = false;
@JsonIgnore private Authored authored;
}
如果我将 subject
类型设置为 Entity
原始类型,它就像一个魅力,但如果我让 Entity<?>
作为类型,它会产生这个错误。由于我 api 中的几乎所有资源都是可评论的或有一个集合,所以每次我从数据库中获取时都会发生此错误。
N.B:每个节点实体都继承自Entity<T>
,也就是neo4j-ogm指南中提供的Entity<T>
class