Java 为什么会话bean方法在引发RuntimeException时引发EjbTransactionRolledbackException

Java 为什么会话bean方法在引发RuntimeException时引发EjbTransactionRolledbackException,java,java-ee-6,jpa-2.0,ejb-3.1,bean-validation,Java,Java Ee 6,Jpa 2.0,Ejb 3.1,Bean Validation,我正在尝试使用约束验证来持久化实体, 当调用persist时-会抛出约束,调用方会得到EjbTransactionRolledbackException。。。 因此,我尝试显式调用验证并抛出ConstraintViolationException/RuntimeException,调用方仍然会得到EjbTransactionRolledbackException。。。 当我抛出MyExceptionextendsException时,调用者获取MyException 即使我调用explicits

我正在尝试使用约束验证来持久化实体, 当调用persist时-会抛出约束,调用方会得到
EjbTransactionRolledbackException
。。。 因此,我尝试显式调用验证并抛出
ConstraintViolationException
/
RuntimeException
,调用方仍然会得到
EjbTransactionRolledbackException
。。。 当我抛出
MyException
extends
Exception
时,调用者获取
MyException

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

这不应该是行为

发生什么事了

配置:

Netbeans 6.9.1 玻璃鱼3.0.1 JPA2.0(日食) EJB3.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);
}
@无状态
我的公共课{
@持久上下文
实体管理器;
@资源
验证器;
公共秩序结帐(订单){
Set=validator.validate(order,Default.class);
如果(!set.isEmpty()){
sc.setRollbackOnly();
//抛出新的ConstraintViolationException(新哈希集
因此,我尝试显式调用验证并抛出ConstraintViolationException/RuntimeException,但调用方仍然获取EjbTransactionRolledbackException

提供完整的stacktrace可能会有所帮助。无论如何,我想知道您是如何调用EJB的,以及是否正在传播事务,在这种情况下,在发生系统异常的情况下,抛出EJBTransactionRolledbackException是正确的行为。但以下博文可能会有所帮助:

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


  • 关于Bean验证

  • 为了整合@Pascal的答案,还可以用


    javax.validation.ConstraintViolationException真是一个很好的答案!如果我把上面的XML放在ejb-jar.XML中,我会告诉ejb上下文,如果抛出javax.validation.ConstraintViolationException,调用者将得到应用程序异常(不会破坏会话bean),而不是系统异常
     @javax.ejb.ApplicationException(rollback = true)
     public class UncheckedException extends RuntimeException {...}