私はWeld 2.2.6 Finalを実行するWildfly 8.2.1 Finalで働いています。サブタイプとジェネリックはどのようにCDI/Weldで解決されますか?
@Entity
public class Fruit{ ... }
@Entity
public class Apple extends Fruit{ ... }
public interface Repository<T extends Identifiable> { ... }
public interface Identifiable { String getId(); }
と
@ApplicationScoped
public class FruitCDIDelegateRepository implements Repository<Fruit>, SearchableRepository<Fruit> { @EJB private FruitRepository repo; }
@Stateless
@LocalBean
@Typed(FruitRepository.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class FruitRepository extends PersistenceRepository<Fruit> implements SearchableRepository<Fruit, FruitCriteria> {
考えると、最後の2つのリポジトリには、ストレートアンドリュー・リーRubingerと アスラクKnidsenの著書のJavaで 連続エンタープライズ開発のうち、構文です。これは、EJBとCDIが一緒に を処理するのを助けるための回避策です。本の中で、彼らは
書くこのEJBが原因CDI EJB 相互作用の制限/エラーにリポジトリの下 CDIによってピックアップされるのを避けるために、特定の型に@Typedされます。 EJB Beansは常にリポジトリとして解決されます。つまり、 リポジトリインタフェースを実装する2つのEJBは、 InjectionPoint @Inject Repositoryに応答し、InjectionPoint をあいまいにします。
WorkAroundとして、TypeIシステムで使用できるCDI Bean のTransactionalプロパティを持つEJBをラップします。 EJBは内部実装 とみなされます。 ConferenceCDIDelegateRepository によって提供されるCDIタイプは、実際のリポジトリAPIです。
この文脈では、他のクラスは無視してください。
私はクラスで
@Inject
Repository<Apple> repository;
を宣言し、FruitRepository
(CDIDelegate
一種)を得ることができないでしょうか?同様の場合
@Inject
Repository<Fruit> repository;
同じ環境では、予想されるオブジェクトが生成されます。
なぜ@Inject FruitRepository fruitRepositoryですか? CDI <-> EJB – jklee
Hmmmを注入することができます。今日私はこれを何度も包みましたか?私は私の頭をクリアしなければならないと私はあなたに戻って取得します。現時点では、私は言うべきことですが、そうであるように思われ、あなたの提案にスポットが当たっています。私の頭をクリアするためにオフ... – Mats