为什么在抛出RuntimeException时会话bean方法抛出EjbTransactionRolledbackException

问题描述 投票:5回答:2

我正在尝试通过约束验证来保留实体,当调用持续存在时-存在引发的约束并且调用方获取EjbTransactionRolledbackException ...因此,我尝试显式调用验证并抛出ConstraintViolationException / RuntimeException,而调用方仍然得到EjbTransactionRolledbackException ...当我抛出MyException扩展为Exception-调用者获取MyException

即使我调用显式sc.setRollBackOnly,它仍然会发生:(

这不应该是这种行为。

怎么回事?

配置:

Netbeans 6.9.1玻璃鱼3.0.1JPA 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
2个回答
11
投票
所以我尝试显式调用验证并抛出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>

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

资源

关于EJB和应用程序与系统的例外:


0
投票
@javax.ejb.ApplicationException(rollback = true) public class UncheckedException extends RuntimeException {...}
© www.soinside.com 2019 - 2024. All rights reserved.