Philipp
Philipp

Reputation: 333

PersistenceContextType.EXTENDED leads to failed lookup of Session Bean

I am upgrading from JBoss 7.1.1 to WildFly 8.1.0 and can't get rid of the error described below:

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 is:

@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();
    }
}

with AbstractDAO like:

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;
    }
}

This construct works when using only @PersistenceContext(unitName = "CSAR_GUI"), except for the expected LazyInitializationException when accessing data on the JSF-page.

The root-cause for error above is:

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)

Is this a bug in WildFly? Was this working only because of a bug in JBoss? Or am I doing something completely wrong?

Upvotes: 1

Views: 543

Answers (2)

jersey-ninja
jersey-ninja

Reputation: 1158

Extended persistence context can only be used in stateful session beans. See EJB 3.2 spec section 11.11.1.1 or this article: http://docs.jboss.org/ejb3/app-server/tutorial/extended_pc/extended.html

Upvotes: 2

Philipp
Philipp

Reputation: 333

It appears that the failing code was implemented in JBoss 7.2.0. At this time the setting default-extended-persistence-inheritance was introduced. Along came the Method

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() was throwing the ArrayIndexOutOfBounds-Exception.

When setting default-extended-persistence-inheritance="DEEP" in standalone.xml and marking TransRbDAO @Stateful the error disappears.

I'm not sure whether it was a bug in JBoss 7.1.1 that I used, or if it is a bug since 7.2.0, clarification is appreciated ;)

Upvotes: 0

Related Questions