5

永続化を呼び出すときに、制約の検証を使用してエンティティを永続化しようとしています-スローされ、呼び出し元が取得する制約がありますEjbTransactionRolledbackException...したがって、検証を明示的に呼び出してスローConstraintViolationException/RuntimeExceptionそれでも呼び出し元を取得しようとします...拡張EjbTransactionRolledbackExceptionをスローすると- 呼び出し元が得るMyExceptionExceptionMyException

私が明示的に呼び出しても、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);
}
4

2 に答える 2

11

そのため、検証を明示的に呼び出して ConstraintViolationException/RuntimeException をスローしようとしましたが、それでも呼び出し元は EjbTransactionRolledbackException を取得します...

完全なスタックトレースを提供すると役立つ場合があります。とにかく、EJB をどのように呼び出しているのか、またトランザクションを伝搬しているのかどうかは疑問です。その場合、EJBTransactionRolledbackException をスローすることが、システム例外の場合の正しい動作です。ただし、次のブログ投稿が役立つ場合があります。

制約違反、トランザクションのロールバック

EJB 3 Bean 内の JPA エンティティで 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>

そうすれば、違反に直接アクセスできます。

資力

于 2010-09-25T12:27:20.430 に答える