我有一个带有大量 Spring MVC Controller 的 Web 应用程序。 这些 Controller 通过 JPA、实体和存储库与数据库进行交互。
我想确保当 spring mvc 处理 Controller 方法时,如果在此过程中抛出任何异常,则在该方法期间追加的所有数据库更改都会回滚。
这里是一个例子:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
Controller
@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 以进行 super 事务管理,就像我们对 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;
}
});
}
最佳答案
这不是最好的设计,但如果需要的话,
您可以尝试使用 throw
子句和 @Transactional
的 rollbackFor
属性来尝试更具体的异常。
看看这个 post .
关于java - 如果 Controller 中抛出异常,Spring JPA 回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40403636/