2014-04-16 108 views
4

我做了一个简单的存储库,其中包含我系统中的所有人员,一切似乎都正常工作。我可以根据给定的键和值添加,删除甚至检索单个人,但由于某些原因,我无法直接检索存储在存储库中的所有人员。我试图通过使用findAll()方法来实现,它应该返回一个可迭代的。然后我尝试迭代迭代器并将每个人存储在我想要函数返回的ArrayList中。Spring Data Neo4J存储库findAll()导致nullpointerexception

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”,以便存储库不为空,但仍然在下面的错误中得到nullpointerexception。

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) 

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

+0

也许你应该使用'Iterator it = p.iterator()' – remigio

+0

我已经尝试了Iterator和Iterable选项,但是一旦我尝试访问它们,都会导致空指针异常。 – Jonhy

回答

1

感谢您的答案!我设法解决问题,通过添加

"<tx:annotation-driven mode="proxy"/> 

我的应用程序上下文xml文件。它现在工作完美!然而,我仍然不确定这个语句是什么,为什么我只需要findAll()方法,而不是其他任何我用过的。 (count(),findOne(),findBySchemaPropertyValue()等)

+0

我不明白这是怎么产生的影响,mode =“proxy”vs mode =“aspectj”只有在你调用非代理对象的方法时才有意义。更多信息[这里](http://stackoverflow.com/a/4162325/1000455)。 – ChoppyTheLumberjack

2

请尝试将您的personRepository.findAll()设为@Transactional

如果它仍然不起作用,你可以发布你的personRepository.findAll()方法吗?

+0

谢谢。也许我应该显示更多我的代码。但是我已经用@transactional注解标记了方法。 personRepository.findAll()也是标准的neo4j模板findAll()函数。 – Jonhy

+0

也许你应该在将来粘贴更多的代码,因为我的答案会和@Conan一样。 – lulu88

+0

如果这是你的建议,它不能解决问题。 '公共接口FooRepository扩展GraphRepository { \t @Override @Transactional结果 findAll(); }' –

0

我试过模式=“代理”,它不适合我,这应该只有一个影响,如果你使用非注入事务方法互相打电话(说明here)。

此'TransactionFailureException'可能与问题相关:https://jira.spring.io/browse/DATAGRAPH-531。如果是这样的话,你需要改变

service.findAll() 

到:

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

...和它应该消失。

相关问题