2017-01-04 17 views
0

私は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; 

を宣言し、FruitRepositoryCDIDelegate一種)を得ることができないでしょうか?同様の場合

@Inject 
Repository<Fruit> repository; 

同じ環境では、予想されるオブジェクトが生成されます。

+1

なぜ@Inject FruitRepository fruitRepositoryですか? CDI <-> EJB – jklee

+0

Hmmmを注入することができます。今日私はこれを何度も包みましたか?私は私の頭をクリアしなければならないと私はあなたに戻って取得します。現時点では、私は言うべきことですが、そうであるように思われ、あなたの提案にスポットが当たっています。私の頭をクリアするためにオフ... – Mats

答えて

1

ラスタなしで@Statlessリポジトリを挿入できます。

@RequestScoped 
public class Service { 

    @Inject 
    FruitRepository fruitRepository; 

    public void saveFruit(Fruit fruit){ 
     fruitRepository.save(fuit); 
    } 

} 
+0

私はまっすぐに設定していただきありがとうございます。私はジェネリック型のパラメータをあまりにも多くのターンを取って、スマートすぎる(初めてではない)。私は絶対にその数時間前に見たはずです。 "私の頭をぶら下げる" – Mats

+1

あなたは歓迎です – jklee

関連する問題