PersistenceContextType.EXTENDED导致会话Bean的查找失败

时间:2014-08-26 13:01:49

标签: jsf jpa ejb cdi wildfly

我正在从JBoss 7.1.1升级到WildFly 8.1.0,无法摆脱下面描述的错误:

14:53:04,666 ERROR [org.jboss.as.ejb3.invocation] (default task-17) JBAS014134: EJB Invocation failed on component TransRbDAO for method public java.util.List de.bss.dm.kairos.db.kairosgui.TransRbDAO.findAll(): javax.ejb.EJBException: java.lang.IllegalStateException: JBAS011048: Failed to construct component instance

TransRbDAO是:

@Stateless
public class TransRbDAO extends AbstractDAO<TransRb> {
    public List<TransRb> findAll() {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<TransRb> criteria = cb.createQuery(TransRb.class);
        Root<TransRb> root = criteria.from(TransRb.class);
        criteria.select(root);
        return em.createQuery(criteria).getResultList();
    }
}

与AbstractDAO一样:

public class AbstractDAO<T> {
    @Inject
    @CsarGuiDBExtended
    @PersistenceContext(unitName = "CSAR_GUI", type = PersistenceContextType.EXTENDED)
    protected EntityManager em;

    public T findById(Class<T> clazz, Object primaryKey) {
        T i = em.find(clazz, primaryKey);
        return i;
    }
}

此构造在仅使用@PersistenceContext(unitName =“CSAR_GUI”)时有效,但在访问JSF页面上的数据时除了预期的LazyInitializationException之外。

上述错误的根本原因是:

Caused by: javax.naming.NamingException: JBAS011878: Failed to lookup env/de.bss.dm.kairos.db.kairosgui.AbstractDAO/em [Root exception is java.lang.ArrayIndexOutOfBoundsException]
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:144)
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:81)

这是WildFly中的错误吗?这是因为JBoss中的错误吗?或者我做错了什么?

2 个答案:

答案 0 :(得分:2)

扩展持久性上下文只能在有状态会话bean中使用。 请参阅EJB 3.2规范部分11.11.1.1或本文: http://docs.jboss.org/ejb3/app-server/tutorial/extended_pc/extended.html

答案 1 :(得分:0)

似乎失败的代码是在JBoss 7.2.0中实现的。这时候的设定 引入了default-extended-persistence-inheritance。随之而来的是方法

static Map<String, ExtendedEntityManager> More ...getCurrentCall() {
    ArrayList<Map<String, ExtendedEntityManager>> stack = currentSFSBCallStack();
    Map<String, ExtendedEntityManager> result = null;
    if (stack != null) {
        result = stack.get(stack.size() - 1);
    }
    return result;
}

stack.get()抛出了ArrayIndexOutOfBounds - 例外。

default-extended-persistence-inheritance="DEEP"中设置standalone.xml并标记TransRbDAO @Stateful时,错误消失。

我不确定这是否是我使用的JBoss 7.1.1中的错误,或者自7.2.0以来它是否是一个错误,理解澄清;)

相关问题