2

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モジュールに配置された抽象クラスに問題はありますか?

4

2 に答える 2

0

EJB でジェネリックを使用すると、問題が発生する可能性があります。

EJB 3.1 でのジェネリックの使用を参照してください。

qualifiedまたは、階層内に EJB を作成することもできます。javax.inject.Qualifierを参照してください。

于 2013-02-28T14:09:35.037 に答える
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

そして突然すべてがうまくいきます。

于 2018-09-13T14:59:33.850 に答える