JSFCDIBeanの親である抽象クラスにEJBを挿入する際に問題が発生しました。私のプロジェクトでは、MyFaces CODI 1.0.5(ViewScope)、Omnifaces 1.3、PrimeFaces 3.4.2、GlassFish3.1.2を使用しています。
アプリケーションはEARであり、抽象クラスはEJBモジュールにあり、JSFCDIBeanは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();
}
私のCDIBean:
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モジュールに配置された抽象クラスに問題はありますか?