我有理解EJBTransactionRolledbackException問題。追趕EJBTransactionRolledbackException
我有實體:
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@Size(max=5)
private String name;
//...
}
和資源庫這是因爲易於CMT的SLSB:
@Stateless
public class ExampleRepository {
@PersistenceContext
private EntityManager em;
public void add(MyEntity me) {
em.persist(me);
}
}
現在我測試的Servlet,當我模擬ConstraintViolation(太長名)。
@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塊的消息(「異常被捕獲」),但在此之前有大量異常日誌產生(link)。 我不太明白髮生了什麼 - 這個異常是否被捕獲?如何在這種簡單的情況下防止控制檯中的所有這些錯誤消息?
其實我知道可能的解決方案,但我不明白爲什麼在我的方案中的異常似乎被捕獲,但控制檯顯示這麼多的日誌,所以它看起來像它沒有被捕獲 – swch
日誌中的消息是由容器寫的交易協調器組件'arjuna'。看看:* WARN ARJUNA012125:TwoPhaseCoordinator.beforeCompletion - SynchronizationImple *失敗。容器報告它已經捕獲系統異常並中止事務。 – nolexa