2

私は会社でプロジェクトに取り組んでおり、オブジェクトの注入に問題があります。このエンティティプロバイダーがあると考えてみましょう:

@Stateless
@TransactionManagement 
public class EntityProviderBean<T> extends CachingMutableLocalEntityProvider<T> {

    public EntityProviderBean(Class<T> entityClass) {
        super(entityClass);
        setTransactionsHandledByProvider(false);
    }

    @PersistenceContext(unitName = CoreApplication.PERSISTENCE_UNIT)
    private EntityManager em;

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    protected void runInTransaction(Runnable operation) {
        super.runInTransaction(operation);
    }

    @PostConstruct
    public void init() {
        setEntityManager(em);
        setEntitiesDetached(false);
    }
}

上記のエンティティー・プロバイダーを使用して拡張された JPAContainer

@UIScoped
public class IncidentContainer extends JPAContainer<Incident> {

    private static final long serialVersionUID = 8360570718602579751L;

    @Inject
    EntityProviderBean<Incident> provider;

    public IncidentContainer() {
        super(Incident.class);
    }

    @PostConstruct
    protected void init() {
        setEntityProvider(provider);
    }

}

問題は (そして私はそれを理解しています)、inject メソッドには空のコンストラクターが必要なため、クラス型定義で @Inject オブジェクトを実行できないことです。それを機能させる方法のいくつかの解決策はここにありますか? 今、私は例外を受けています

org.apache.webbeans.util.InjectionExceptionUtils.throwUnsatisfiedResolutionException(InjectionExceptionUtils.java:77)

答えてくれてありがとう:)オンドレイ

4

2 に答える 2

0

コンストラクター インジェクション

CDI コンテナーが Bean クラスをインスタンス化すると、CDI Bean の Bean コンストラクターが呼び出されます。

CDI は、Bean のインスタンスを取得するために、デフォルトの Bean コンストラクターまたは @Inject で注釈が付けられたものを探します。

  • CDI Bean が @Inject を使用してコンストラクターを明示的に宣言しない場合、パラメーター/デフォルト Bean コンストラクターは CDI コンテナーによって受け入れられません。

  • CDI Bean コンストラクターは、任意の数のパラメーターを持つことができ、コンテナーは、Bean コンストラクターの注入ポイントであるすべてのパラメーターを初期化/注入します。
  • CDI Bean クラスには、@Inject アノテーションが付けられた単一のコンストラクターのみを含めることができます。CDI コンテナーが @Inject で注釈が付けられた複数のコンストラクターを検出すると、エラーがスローされます。

Bean コンストラクター インジェクションには、Bean を不変にすることができる利点が 1 つあります。

あなたの場合の問題は

IncidentContainer Bean クラスには、デフォルトのコンストラクターまたは @Injection で注釈が付けられたコンストラクターがありません。

以下のように設定できます

public class IncidentContainer extends JPAContainer<Incident> {

    // @Inject no need to do filed injection here
    private EntityProviderBean<Incident> provider;

    @Inject // add this one
    public IncidentContainer(EntityProviderBean<Incident> provider) {
        super(Incident.class);
        this.provider = provider;
    }

    @PostConstruct
    protected void init() {
        setEntityProvider(provider);
    }
}

EntityProviderBean Bean クラスには、デフォルトのコンストラクターまたは @Injection でアノテーションが付けられたコンストラクターがありません。

以下のように設定できます

public class EntityProviderBean<T> extends CachingMutableLocalEntityProvider<T> {

    public EntityProviderBean(Class<T> entityClass) {
        super(entityClass);
        setTransactionsHandledByProvider(false);
    }
    // add this cdi bean construtor
    @Inject
    public EntityProviderBean(Incident incident) {
        this((Class<T>) incident.getClass());
    }

    protected void runInTransaction(String operation) {
        super.runInTransaction(operation);
    }
}
于 2013-11-18T10:25:38.123 に答える