为什么会session bean方法抛出runtime exception时抛出ejbtransactionroledbackexception
-
05-10-2019 - |
题
当调用持续存在时,我试图通过约束验证坚持实体 - 有限制,呼叫者得到 EjbTransactionRolledbackException
...所以我尝试将验证拨打明确打电话给 ConstraintViolationException
/RuntimeException
而且呼叫者仍然得到 EjbTransactionRolledbackException
...当我扔 MyException
扩展 Exception
- 呼叫者得到 MyException
即使我致电显式 sc.setRollBackOnly
它仍然发生了:(
这不应该是行为。
这是怎么回事?
配置:
Netbeans 6.9.1 Glassfish 3.0.1 JPA 2.0(Eclipselink)EJB 3.1
谢谢!!!
@Stateless
public class My {
@PersistenceContext
EntityManager em;
@Resource
Validator validator;
public Order checkout(Order order) {
Set<ConstraintViolation<Order>> set = validator.validate(order, Default.class);
if (!set.isEmpty()) {
sc.setRollbackOnly();
//throw new ConstraintViolationException(new HashSet<ConstraintViolation<?>>(set));
throw new RuntimeException();
}
this.em.persist(order);
}
解决方案
因此,我尝试调用验证显式并投掷约束ViolationException/runtimeException,但呼叫者仍然获得EJBTRANSACTIONROLLEDBACKEXCEPTION ...
提供完整的StackTrace可能会有所帮助。无论如何,我想知道您如何调用EJB,如果您正在传播交易,在这种情况下,抛出ejbtransactionRoledBackexception是正确的行为,以防系统异常。但是以下博客文章可能会有所帮助:
违反约束,交易回滚
在EJB 3 bean中使用bean验证的JPA实体时,如果存在约束,您实际上将获得EJBTRANSACTIONROLLEDBACKEXCEPTION。
javax.ejb.EJBTransactionRolledbackException: Invalid object at persist time for groups [javax.validation.groups.Default, ] Caused by: javax.validation.ConstraintViolationException: Invalid object at persist time for groups [javax.validation.groups.Default, ]
根据规范,这一切都很好,但并不是真正有趣的信息。您真的不想知道发生了什么,您想知道出了什么问题。
因此,我建议将以下内容添加到您的ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> <assembly-descriptor> <application-exception> <exception-class>javax.validation.ConstraintViolationException</exception-class> <rollback>true</rollback> </application-exception> </assembly-descriptor> </ejb-jar>
这样,您可以直接访问违规行为。
资源
- 在EJB和应用程序与系统异常:
- 关于豆验证