简体   繁体   English

获取孩子时的 Spring-data-neo4j NullPointerException

[英]Spring-data-neo4j NullPointerException when get children

I am currently working on spring-data-neo4j and need to get the children of certain nodes.我目前正在研究 spring-data-neo4j,需要获取某些节点的子节点。

Here is the domain这是域

@NodeEntity
public class GLNode {

    @GraphId
    private Long id;

    @Property(name="description")
    private ArrayList<String> desc;

    public ArrayList<String> getDesc() {
        return this.desc;
    }

    @Relationship(type = "GLRelationship")
    private Collection<GLNode> children;

    public Collection<GLNode> getChildren(){
        return this.children;
    }

}

here is the repository这是存储库

@Query("MATCH (n:GLNode) WHERE id(n)={0} RETURN n")
GLNode getGLNodeFromId(Integer idOfNode);

In the service, I successfully get the node but get null pointer when try to access its children like:在服务中,我成功获取了节点,但在尝试访问其子节点时获取空指针,例如:

    GLNode m = repo.getGLNodeFromId(0);
    System.out.println(m.getChildren().iterator().next().getDesc().toString());

Here's the exception:这是例外:

java.lang.NullPointerException
    com.hersbitcloud.cancercloud.services.GLService.getGLNodes(GLService.java:40)
    com.hersbitcloud.cancercloud.controllers.GLController.getGLNodes(GLController.java:36)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    com.hersbitcloud.cancercloud.CORSFilter.doFilter(CORSFilter.java:24)
    org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

I am sure m has been successfully retrieved.我确定m已成功检索。 What am I doing wrong here?我在这里做错了什么?

Thank you.谢谢你。

getChildren() will be null with your custom query getChildren()将为您的自定义查询为空

@Query("MATCH (n:GLNode) WHERE id(n)={0} RETURN n")
GLNode getGLNodeFromId(Integer idOfNode);

because the query returns only the node and no relationships (depth 0).因为查询只返回节点,没有关系(深度 0)。

If you are retrieving the node by ID, then repository.findOne(id) or neo4jOperations.load(GLNode.class,id) would be more appropriate.如果您通过 ID 检索节点,那么repository.findOne(id)neo4jOperations.load(GLNode.class,id)会更合适。 These methods load entities to a default depth of 1 which means, related entities one hop away.这些方法将实体加载到默认深度 1,这意味着相关实体相距一跳。

You can change this default depth using repository.findOne(id,depth) or neo4jOperations.load(GLNode.class,id,depth)您可以使用repository.findOne(id,depth)neo4jOperations.load(GLNode.class,id,depth)更改此默认深度

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM