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