Spring事务注解回滚测试似乎不够顺利。

3

以下是控制器(Controller)代码:

@GetMapping("/test/hello")
    public String test()  {
        Member m = memberService.transactionTest();
        return "haha";
    }

以下是服务代码:

   @Transactional(rollbackFor = NullPointerException.class)
    public Member transactionTest() {
            Member m = Member.builder()
                    .username("rollback")
                    .age(32)
                    .team(teamRepository.findById(1L).get())
                    .coach(coachRepository.findById(1L).get())
                    .build();
            memberRepository.save(m);
            exception();
            return m;
    }

    public void exception(){
        Member m = null;
        m.getUsername();
    }

据我所知,由于出现了RuntimeException,当它完成时应该回滚,但插入过程很顺利,所以我想知道原因。

3
这个仓库也是事务性的吗?如果是,它是否有默认传播行为?顺便说一句,默认行为是在任何运行时异常时回滚,所以没有必要显式地提出rollbackFor(我不确定这是否会增加默认行为或覆盖它)。 - Thomas
1
你在使用哪个数据库,是否是MySQL? - M. Deinum
M.Deinum它连接到MariaDB sur Thomas我没有设置任何传播设置,我只在那个方法上放置了Transactional选项T.T - 유호연
1个回答

2
因为Optional.get()会抛出NoSuchElementException(而不是空指针)。
javadoc中可以看到:

public T get()

如果在此 Optional 中存在一个值,则返回该值;否则抛出NoSuchElementException...

通过设置rollbackFor = NullPointerException.class,您可以将NoSuchElementException从可回滚异常中排除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接