如果在控制器

时间:2016-11-03 14:07:53

标签: java spring-mvc spring-data-jpa transactional

我有一个带有大量弹簧mvc控制器的webapp。 这些控制器与具有JPA,实体和存储库的DB交互。

我想确保当spring mvc处理控制器方法时,如果在此过程中抛出任何异常,则在该方法期间追加的所有数据库更改都将回滚。

这是一个例子:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

控制器

@Controller
public class JpaTest {

    @Autowired
    GroupRepository groupRepository;

    @RequestMapping(value = "/{langId}/jpatest", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    @Transactional
    public String test() throws Exception {
        Group group = new Group();
        group.setName("jpaTest");
        groupRepository.save(group);
        throw new Exception("MY EXCEPTION ");
    }
}

我希望该组不会添加到数据库中!

我希望@Transactional会成功,但不是。

我添加了

  <tx:annotation-driven transaction-manager="transactionManager" />

但没有效果。 有没有办法简单地做到这一点?

或者我可以封装我的调度程序Servlet来进行超级事务管理,就像我们对jeeves所做的那样:

protected void doDispatch(final HttpServletRequest request, final HttpServletResponse response) throws Exception {
    JeevesDispatcherServlet.super.doDispatch(request, response);

    TransactionManager.runInTransaction("jeevesDispatchServlet", getWebApplicationContext(),
        TransactionManager.TransactionRequirement.CREATE_ONLY_WHEN_NEEDED,
        TransactionManager.CommitBehavior.ONLY_COMMIT_NEWLY_CREATED_TRANSACTIONS,
        false, new TransactionTask<Void>() {
            @Override
            public Void doInTransaction(TransactionStatus transaction) throws Throwable {
                JeevesDispatcherServlet.super.doDispatch(request, response);

                return null;
            }
        });
}

2 个答案:

答案 0 :(得分:1)

这不是最好的设计,但如果需要, 您可以使用throw子句和rollbackFor的{​​{1}}属性尝试使用更具体的例外。

看看这个post

答案 1 :(得分:-2)

为什么要为单个插入/保存操作创建事务。如果保存失败,则不会保存,因此无法回滚