【问题标题】:Spring Data Neo4J repository findAll() results in a nullpointerexceptionSpring Data Neo4J 存储库 findAll() 导致空指针异常
【发布时间】:2014-05-31 11:15:09
【问题描述】:

我创建了一个简单的存储库,其中包含我系统中的所有人员,一切似乎都运行良好。我可以根据给定的键和值添加、删除甚至检索单个人员,但由于某种原因,我无法直接检索存储在存储库中的所有人员。我尝试使用 findAll() 方法来做到这一点,该方法应该返回一个可迭代的。然后我尝试使用可迭代对象进行迭代,并将每个人存储在我希望函数返回的数组列表中。

    public List<Person> getAllPersons() {
    Iterable<Person> p = personRepository.findAll();
    System.out.println("person count: " + personRepository.count());
    List<Person> persons = new ArrayList<Person>();
    for (Person person : p) {
        System.out.println("person");
        persons.add(person);
    }
    return persons;
}

打印行打印“3”,所以存储库不是空的,但我仍然在下面的错误中得到一个空指针异常。

apr 16, 2014 3:45:54 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [bmsapp] in context with path [/bmsapp] threw exception [Request processing failed; nested exception is org.neo4j.graphdb.TransactionFailureException: Failed to mark transaction as rollback only.] with root cause
java.lang.NullPointerException
    at org.neo4j.kernel.TopLevelTransaction.markAsRollbackOnly(TopLevelTransaction.java:93)
    at org.neo4j.kernel.TopLevelTransaction.failure(TopLevelTransaction.java:86)
    at org.neo4j.cypher.internal.spi.v2_0.TransactionBoundExecutionContext.close(TransactionBoundExecutionContext.scala:58)
    at org.neo4j.cypher.internal.compiler.v2_0.spi.DelegatingQueryContext.close(DelegatingQueryContext.scala:32)
    at org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext.org$neo4j$cypher$internal$compiler$v2_0$spi$ExceptionTranslatingQueryContext$$super$close(ExceptionTranslatingQueryContext.scala:34)
    at org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$$anonfun$close$1.apply$mcV$sp(ExceptionTranslatingQueryContext.scala:34)
    at org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$$anonfun$close$1.apply(ExceptionTranslatingQueryContext.scala:34)
    at org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$$anonfun$close$1.apply(ExceptionTranslatingQueryContext.scala:34)
    at org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext.org$neo4j$cypher$internal$compiler$v2_0$spi$ExceptionTranslatingQueryContext$$translateException(ExceptionTranslatingQueryContext.scala:149)
    at org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext.close(ExceptionTranslatingQueryContext.scala:34)
    at org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator.failIfThrows(ClosingIterator.scala:94)
    at org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator.next(ClosingIterator.scala:45)
    at org.neo4j.cypher.internal.compiler.v2_0.PipeExecutionResult.next(PipeExecutionResult.scala:168)
    at org.neo4j.cypher.internal.compiler.v2_0.PipeExecutionResult.next(PipeExecutionResult.scala:34)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
    at scala.collection.convert.Wrappers$IteratorWrapper.next(Wrappers.scala:30)
    at org.neo4j.cypher.internal.compiler.v2_0.PipeExecutionResult$$anon$1.next(PipeExecutionResult.scala:76)
    at org.neo4j.helpers.collection.IteratorWrapper.next(IteratorWrapper.java:47)
    at org.neo4j.helpers.collection.IteratorWrapper.next(IteratorWrapper.java:47)
    at bmsapp.repository.NeoPersonDao.getAllPersons(NeoPersonDao.java:33)
    at bmsapp.service.SimplePersonManager.getPersons(SimplePersonManager.java:32)
    at bmsapp.web.HelloController.HelloHandler(HelloController.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:744)

我已经浪费了几个小时来解决这个问题,但没有任何运气。有人可以帮我吗?

【问题讨论】:

  • 也许你应该使用Iterator&lt;Person&gt; it = p.iterator()
  • 我已经尝试过 Iterator 和 Iterable 选项,但是当我尝试访问它们时都会导致空指针异常。

标签: java spring spring-data spring-data-neo4j


【解决方案1】:

尝试将您的personRepository.findAll() 标记为@Transactional

如果还是不行,可以发一下personRepository.findAll()的方法吗?

【讨论】:

  • 谢谢。也许我应该展示更多我的代码。但是我已经用@transactional 注释标记了该方法。 personRepository.findAll() 也只是标准的 neo4j 模板 findAll() 函数。
  • 也许您以后应该粘贴更多代码,因为我的答案与@Conan.. 相同。
  • 如果这是您的建议,它并不能解决问题。 public interface FooRepository extends GraphRepository&lt;Foo&gt; { @Override @Transactional Result&lt;Foo&gt; findAll(); }
【解决方案2】:

感谢您的回答!我设法通过添加

解决了这个问题
"<tx:annotation-driven mode="proxy"/>

到我的应用程序上下文 xml 文件。它现在工作得很好!但是我仍然不确定这个声明做了什么以及为什么我只需要 findAll() 方法而不是我使用过的任何其他方法。 (count()、findOne()、findBySchemaPropertyValue() 等)

【讨论】:

  • 我看不出这会有什么影响,mode="proxy" 与 mode="aspectj" 仅在您调用非代理对象上的方法时才相关。更多信息here.
【解决方案3】:

我尝试了 mode="proxy" 但它对我不起作用,这只会在您使用非注入事务方法相互调用时产生影响(解释 here)。

此“TransactionFailureException”可能与以下问题有关:https://jira.spring.io/browse/DATAGRAPH-531。如果是这种情况,你需要改变

service.findAll()

到:

service.findAll().as(Collection.class)

...它应该会消失。

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 2020-11-10
    • 2012-11-27
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2014-03-18
    相关资源
    最近更新 更多