我有一个将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
,突然一切都很好。
谢谢你的回答。我知道泛型可能会有问题,但我没有在任何地方找到我所能完成的,也不能完成的任务。我来解决问题,看看我编辑的问题。 – kralm 2013-03-04 08:35:44