gpt4 book ai didi

java - 捕获 EJBTransactionRolledbackException

转载 作者:行者123 更新时间:2023-12-02 03:58:15 29 4
gpt4 key购买 nike

我无法理解 EJBTransactionRolledbackException。

我有实体:

@Entity
public class MyEntity {

@Id
@GeneratedValue
private Long id;
@Size(max=5)
private String name;
//...
}

存储库是 SLSB,因为易于 CMT:

@Stateless
public class ExampleRepository {
@PersistenceContext
private EntityManager em;

public void add(MyEntity me) {
em.persist(me);
}
}

现在,当我模拟 ConstraintViolation(名称太长)时,我已经测试了 Servlet。

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
@Inject
private ExampleRepository repo;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
MyEntity me = new MyEntity();
me.setName("TooLongName");
try {
repo.add(me);
} catch(EJBTransactionRolledbackException e) {
System.out.println("Exception caught");
}
}
}

我知道在这种情况下,EJB 容器将包装 ConstraintViolationException,因此我改为捕获 EJBTransactionRolledbackException。问题是,在控制台中,我可以看到来自 catch block 的消息(“异常捕获”),但在此之前生成了大量异常日志( link )。我不太明白发生了什么 - 这个异常是否被捕获?在如此简单的场景中如何防止控制台中出现所有这些错误消息?

最佳答案

请看这个解释:A clear explanation of system exception vs application exception

您必须了解,处理异常和处理事务是同时发生的两件不同的事情。 系统异常无条件触发事务回滚。当您看到 ConstraintViolationException(这是一个系统异常,因为它扩展了 RuntimeException)时,它不仅仅是包装和重新抛出。在此过程中发生了一件坏事 - 您的交易已中止。

因此,回答第一个问题,如果异常 (ConstraintViolationException) 被捕获 - 是的,它被容器捕获。事务被中止,并抛出一个新的异常来通知应用程序代码。

您可以禁止记录这些消息,但这样您就不会知道数据持久性失败。

关于java - 捕获 EJBTransactionRolledbackException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35212060/

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