2017-08-14 75 views
0

2つのBeanがあります。WELD-001409:修飾子@Defaultを持つタイプTのあいまいな依存関係

最初のモデルは、私が生産で使用しているモデルのModelです。

@Named("model") 
@RequestScoped 
public class Model{ 

} 

2番目は、私がテストに使用するModelの拡張子です。

@Named("modelTest") 
@RequestScoped 
public class ModelTest extends Model{ 

} 

CDIにデフォルトでModelを選択させるにはどうすればよいですか?

+0

テストは、テストするクラスを拡張するべきではありません。 – Tom

+0

そのjunitテストではありません。その別のテスト。 Webコンポーネントのカスタムテスト。それは問題ではありません。なぜなら、私は単にインターフェイスの2つの実装を持っていただけで、この問題が発生するからです。 – user2914191

+1

[https://dzone.com/articles/java-ee6-cdi-named-components]を見てみましょう – Egl

答えて

1

指定された型の 'default' beanを変更したいし、修飾子を使いたくないので、元のbeanをどこにも挿入しないと仮定します。したがって、あなたがたどったのはの代替品または専門店です。

我々はおよそ選択肢を話した場合、あなたは@Alternative注釈に新しいBeanをマークしても、それを「選択」する必要があります - @Priority(int)beans.xmlまたは単にグローバルに豆のアーカイブごとに行うことができるという。ここでは、コードスニペットは、次のとおりです。

@Named("modelTest") 
@RequestScoped 
@Alternative 
@Priority(1) // "activates"/selects the alternative 
public class ModelTest extends Model{ 
} 

選択された代替を使用すると、以前のタイプ(Model)を注入したときに、それは同様に注入点に合うように、CDIではなく、(ModelTest)この代替を注入します。

セカンダリオプションは特化です。代替案と非常によく似ていますが、元のBeanが「破棄」されるように厳密になっています。詳しくはCDI specを参照してください。スペシャライゼーションには、修飾子とBeanの名前の継承(もありますが、)があります。 Beanを選択する必要もありません(代替手段とは対照的に)。

@RequestScoped 
@Specializes 
public class ModelTest extends Model{ 
    // bean name with be inherited automatically as "model" 
} 

注:Beanは、仕様に従って、一度に1つのBean名しか持つことができません。したがって、ある名前を継承して別の名前を宣言すると、エラーが発生します。それに応じてコードを変更します。

関連する問題