2017-07-08 15 views
0

遺産とCDIに関する質問があります。 与えられた二つのインターフェース:遺産とCDIの注射

  • カー・インタフェースIが注入したいどのような車

    interface Car { 
    } 
    
    interface SportCar extends Car{ 
    
    } 
    
    
    class DefaultCar implements Car { 
    
    } 
    
    
    @FerrariQualifier 
    class DefaultSportCar implements SportCar { 
    
    } 
    

を拡張

  • SportCar:

    @Inject 
        private Car car; //inject DefaultCar 
    
        @Inject 
        @FerrariQualifier 
        private Car ferrari; //inject DefaultSportCar 
    
    
        @Inject 
        private SportCar sportCar;//inject DefaultSportCar 
    

    どのようにすることができます 私がする?

  • +0

    問題があると仮定すると、現在のコードで得られるあいまいな解決例外を実際に表示すると便利です。 – covener

    答えて

    2

    これ以上の例や説明がなければ、最初のものに@Defaultという修飾子を挿入する必要があります。

    これは明らかに、「カー」に@ @デフォルトの修飾子が付いている必要があります。そうでなければ、あいまいな解決があり、適合しないものをCDIに靴ひねりしようとしています。

    1

    私はCDI注入を少し誤解したと思います。あなたはこれをしたい。特にこと:

    @Inject 
    private Car car; //inject DefaultCar 
    

    任意の車の実装(スポーツカーや通常の1)ので、ここでフィットすると、あなたがあいまいな解像度となってしまいます。一時的な解決策として

    は、ユーザーcovenerで述べたように@Default修飾子を使用したりすることがありますが、これは、すぐにあなたが修飾子なしで他の車の実装を紹介して破るためにバインドされています。

    クリーンなソリューションおそらくデザインを再考え、このように階層構造を変更されています。これにより

    interface Car { 
        // all cars, place common methods here 
    } 
    
    interface SportCar extends Car{ 
        // interface for all sport cars 
    } 
    
    interface ClassicCar extends Car{ 
        // interface for all non-sport cars 
        // this is what you will inject 
    } 
    
    class DefaultCar implements ClassicCar { 
    
    } 
    
    @FerrariQualifier 
    class DefaultSportCar implements SportCar { 
    
    } 
    

    することができます、その後:

    @Inject 
    private ClassicCar car; 
    

    そしてDefaultCarのインスタンスを取得します。あなたの注射の残りは同じように動作します。

    他の解決策は、修飾子を使用することです。

    一般的に言えば、あいまいな解決策に遭遇すると、複数の注入が可能なBeanがあり、修飾子を使用するか、より特定のインターフェース/クラスを注入することによって選択を絞り込む必要があります。