我将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模块中的抽象类是否存在问题?
答案 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
突然一切都好了。