【问题标题】:Why session bean method throw EjbTransactionRolledbackException when RuntimeException was thrown为什么在抛出 RuntimeException 时会话 bean 方法会抛出 EjbTransactionRolledbackException
【发布时间】:2010-09-25 11:45:26
【问题描述】:

我正在尝试通过约束验证来持久化实体, 当调用持久化时-抛出约束并且调用者得到EjbTransactionRolledbackException... 所以我尝试显式调用验证并抛出ConstraintViolationException/RuntimeException,调用者仍然得到EjbTransactionRolledbackException... 当我抛出MyException 扩展Exception - 调用者得到MyException

即使我调用明确的sc.setRollBackOnly 它仍然会发生:(

这不应该是这种行为。

发生了什么事?

配置:

Netbeans 6.9.1 玻璃鱼 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);
}

【问题讨论】:

    标签: java java-ee-6 jpa-2.0 ejb-3.1 bean-validation


    【解决方案1】:

    所以我尝试显式调用验证并抛出 ConstraintViolationException/RuntimeException 并且调用者仍然得到 EjbTransactionRolledbackException...

    提供完整的堆栈跟踪可能会有所帮助。无论如何,我想知道你是如何调用你的 EJB 的,如果你正在传播一个事务,在这种情况下抛出一个 EJBTransactionRolledbackException 是在系统异常的情况下的正确行为。但以下博客文章可能会有所帮助:

    Constraint violated, transaction rolled back

    在 JPA 上使用 bean 验证时 EJB 3 bean 中的实体 实际上会得到一个 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>
    

    这样您就可以直接访问您的 违规。

    资源

    【讨论】:

    • java.sun.com/xml/ns/javaee" xmlns:xsi="w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" java.sun.com/xml/ns/javaee java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> javax.validation.ConstraintViolationExceptiontrue-exception>
    • 很好的答案!如果我将上面的 XML 放在 ejb-jar.xml 中,我会告诉 EJB 上下文,如果抛出 javax.validation.ConstraintViolationException,调用者将获得应用程序异常(不破坏会话 bean)而不是系统异常跨度>
    【解决方案2】:

    只是为了整合@Pascal的答案,也可以用

    标记异常(如果是你自己的话)
     @javax.ejb.ApplicationException(rollback = true)
     public class UncheckedException extends RuntimeException {...}
    

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2021-12-20
      • 2021-03-05
      • 2021-03-19
      • 2023-03-14
      相关资源
      最近更新 更多