当调用持续存在时,我试图通过约束验证坚持实体 - 有限制,呼叫者得到 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>

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

资源

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top