2

我在将 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 豆:

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 模块中的抽象类是否存在问题?

4

2 回答 2

0

在 EJB 中使用泛型可能会有些问题。

请参阅EJB 3.1 中泛型的使用

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

于 2013-02-28T14:09:35.037 回答
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

突然一切都好了。

于 2018-09-13T14:59:33.850 回答