【发布时间】:2014-07-18 18:05:42
【问题描述】:
TopLevelTransaction (neo4j-kernel-2.1.2) 中的这一行每次我在通过GraphRepository#findAll() 获得的迭代器上调用next() 时都会抛出NullPointerException:
protected void markAsRollbackOnly()
{
try
{
transactionManager.getTransaction().setRollbackOnly(); // NPE here
}
catch ( Exception e )
{
throw new TransactionFailureException(
"Failed to mark transaction as rollback only.", e );
}
}
我发现了一些关于类似崩溃的线程,但堆栈跟踪略有不同。 this question 上公认的解决方案是使用“代理”事务管理,但这似乎是一种创可贴的解决方案。 This question 还提到了“代理”事务管理,并暗示在使用 AspectJ 时 @Transactional 注释可能有问题。
这确实是一个错误,还是我的项目设置不正确?我的代码与standalone hello world 中的代码基本相同,但主类稍微复杂一些:
@Component
public class Test2 {
@Autowired
FooRepository repo;
public static void main(String[] args) {
AbstractApplicationContext context = new AnnotationConfigApplicationContext("test2");
Test2 test2 = context.getBean(Test2.class);
test2.doStuff();
}
public void doStuff() {
createFoo();
printFoos();
}
@Transactional
public Foo createFoo() {
Foo foo = new Foo();
foo.setName("Derp" + System.currentTimeMillis());
repo.save(foo);
System.out.println("saved " + foo.toString());
return foo;
}
@Transactional
public void printFoos() {
Iterable<Foo> foos = repo.findAll();
System.out.println("findAll() returned instance of " + foos.getClass().getName());
Iterator<Foo> iter = foos.iterator();
System.out.println("iterator is instance of " + iter.getClass().getName());
if(iter.hasNext()) {
iter.next(); // CRASHES HERE
}
}
}
如果需要,我可以发布我的 POM。
【问题讨论】:
标签: neo4j spring-data spring-data-neo4j