2013-02-28 86 views
2

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

的应用程序是一个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被创建,但CriteriaFacad eLocal不被注入,并且在@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模块中的抽象类是否存在问题?

谢谢。

编辑:

我想,这可能是与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 

,突然一切都很好。

回答

0

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

请参阅Use of generics in EJB 3.1

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

+0

谢谢你的回答。我知道泛型可能会有问题,但我没有在任何地方找到我所能完成的,也不能完成的任务。我来解决问题,看看我编辑的问题。 – kralm 2013-03-04 08:35:44