2016-03-18 2 views
1

В настоящее время я работаю над spring-data-neo4j и должен получить детей определенных узлов.Spring-data-neo4j NullPointerException при получении детей

Вот домен

@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; 
    } 

} 

здесь хранилище

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

В службе, я успешно получить узел, но получить нулевой указатель при попытке получить доступ к своим детям, как:

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

За исключением:

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) 

Я уверен, что m был успешно восстановлен. Что я здесь делаю неправильно?

спасибо.

+0

Я думаю, что 'desc' никогда не будет инициализирован и NPE выкинут прямо перед' .iterator() ' – msparer

ответ

1

getChildren() будет аннулирована с пользовательским запросом

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

, поскольку запрос возвращает только узел и никаких отношений (глубина 0).

Если вы извлекаете узел по ID, то более подходящим является repository.findOne(id) или neo4jOperations.load(GLNode.class,id). Эти методы загружают объекты на глубину по умолчанию, равную 1, что означает, что связанные объекты перемещаются в одну сторону.

Вы можете изменить глубину этого по умолчанию с помощью repository.findOne(id,depth) или neo4jOperations.load(GLNode.class,id,depth)

 Смежные вопросы

  • Нет связанных вопросов^_^