如何将EJB注入抽象CDI类?

时间:2013-02-28 10:06:15

标签: java-ee-6 glassfish-3 cdi ejb-3.1 codi

我将EJB注入抽象类是一个问题,抽象类是我的JSF CDI bean的父类。在我的项目中,我使用的是MyFaces CODI 1.0.5(ViewScope),Omnifaces 1.3,PrimeFaces 3.4.2和GlassFish 3.1.2。

应用程序是EAR,抽象类在EJB模块中,JSF CDI bean在WAR模块中:

webframework-demo.ear
|__ webframework-war.war -> concrete JSF CDI bean
|__ webframework-ejb-lib.jar -> abstract class with EJB injection
|__ lib\
    |__ shared libs

我的抽象类:

public abstract class AbstractListPageAction<T extends AbstractViewBean<K>, K extends Serializable> {

    ...

    @EJB
    private CriteriaFacadeLocal<K> facade;

    @PostConstruct
    public void create() {
        ...

        facade.setEntityClass(getEntityClass());
        ...
    }

    ...

    public abstract Class<K> getEntityClass();

}

我的CDI bean:

import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ViewAccessScoped;

@Named
@ViewAccessScoped
public class UserListAction extends AbstractListPageAction<UserViewBean, UserEntity>
        implements Serializable {

    private static final long serialVersionUID = -1178878323047991855L;

    ...

    @Override
    public Class<UserEntity> getEntityClass() {
        return UserEntity.class;
    }

    ...
}

当我部署应用程序并访问JSF页面时,会创建UserListAction,但不会注入CriteriaFacadeLocal,而是在@PostConstruct方法中以NullPointerException结束。

当我更改UserListAction并添加一个空的@PostConstruct方法时,注入了CriteriaFacade并且​​一切正常:

@Named
@ViewAccessScoped
public class UserListAction extends AbstractListPageAction<UserViewBean, UserEntity>
        implements Serializable {

    private static final long serialVersionUID = -1178878323047991855L;

    ...

    @PostConstruct
    public void init() {
    }

    @Override
    public Class<UserEntity> getEntityClass() {
        return UserEntity.class;
    }

    ...
}

我在每个模块中都有beans.xml。但为什么我的CDI bean中必须有一个空的@PostConstruct方法?放置在EJB模块中的抽象类是否存在问题?

2 个答案:

答案 0 :(得分:0)

将泛型与EJB结合使用可能会有些问题。

请参阅Use of generics in EJB 3.1

或者您可以在层次结构中创建qualified EJB。请参阅javax.inject.Qualifier

答案 1 :(得分:0)

我根据已编辑的问题创建了答案:

我认为EAR / EAR模块类加载器可能是一个问题。我将webframework-ejb-lib.jar移到了webframework-war.war WEB-INF / lib文件夹中:

webframework-demo.ear
|__ webframework-war.war -> concrete JSF CDI bean
|   |__ WEB-INF
|       |__lib
|          |__ webframework-ejb-lib.jar -> abstract class with EJB injection
|__ ... (other ejb modules)
|__ lib\
    |__ shared libs

突然一切都好了。