gpt4 book ai didi

spring - 异常在已捕获后传播

转载 作者:行者123 更新时间:2023-12-04 10:29:01 24 4
gpt4 key购买 nike

我遇到了最奇怪的事情,我不知道为什么。描述这一点的最好方法是提供一个简单的例子:

@Service
@Transactional
public class Foo{
public ModelAndView delete(@ModelAttribute("abc") Long id) {
ModelAndView mav = new ModelAndView();
try {
getDaoService().delete(id); //Calls Bar.delete()
} catch (final Exception e) {
// Add a custom error message to the mav for the user to see
mav.getModelMap().addAttribute(blah, blah);
}
return mav;
}
}

@Service
@Transactional
public class Bar {
public void delete(final E entity) throws HibernateException {
if (null != entity) {
try {
sessionFactory.getCurrentSession().delete(entity);
} finally {
sessionFactory.getCurrentSession().flush();
}
}
}
}

在这种特殊情况下,我试图删除一个违反约束的对象 (ORA-02292)。我希望删除会因此失败。当删除失败时,我希望向用户显示适当的自定义消息。

调用失败并在屏幕上显示以下内容,而不是向用户显示自定义消息:

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only



当我使用调试器时,我可以看到错误被适本地捕获,并且 ModelAndView 对象内部包含自定义消息。所以,我不知道为什么在捕获并处理异常后仍然抛出异常。有没有人深入了解为什么会发生这种情况?

最佳答案

关于 @Transactional注释,您可以使用 noRollbackForClassName 声明是否由于给定的异常而回滚您的事务。属性。你可以这样做。

@Service
@Transactional(noRollbackForClassName = "java.lang.Exception")
public class YourClass {
...
}

但是,请注意,只是说 noRollbackForClassName = "java.lang.Exception"将意味着它不会回滚任何异常(或其子类),因此这不是一个好习惯。

您应该做的是,首先找出实际抛出的异常(可能是通过打印出 e.getClass().getName() ),然后将该类名设置为 noRollbackForClassName 值。

原因明智,这是因为如果在尝试 delete() 时抛出一些异常,当前事务会自动标记为仅回滚,如果尝试提交,则会抛出您看到的异常。通过 this 的方法是明确声明此特定异常不应导致回滚。

关于spring - 异常在已捕获后传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7890056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com