【问题标题】:How inject EJB into abstract CDI class?如何将 EJB 注入抽象 CDI 类?
【发布时间】:2013-02-28 10:06:14
【问题描述】:

我在将 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 模块中的抽象类有问题吗?

【问题讨论】:

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


    【解决方案1】:

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

    Use of generics in EJB 3.1

    或者你可以在你的层次结构中创建一个qualified EJB。见javax.inject.Qualifier

    【讨论】:

    • 感谢您的回答。我知道泛型可能是有问题的,但我还没有在任何地方找到我能做什么和不能做什么。我找到了解决方案,请查看我编辑的问题。
    【解决方案2】:

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

    我认为这可能是 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
    

    突然间一切都好了。

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多