2016-07-26 3 views
0

ここでは、一方のクラスは他方のサブクラスです。したがって、@ Injectのあいまいさを防ぐために、@Typed注釈が使用されます。CDIで@Typedを使用したサブクラス実装によるあいまいな依存関係の警告

public class A { 
    @Inject UserScope userScope; 
} 

あいまい依存:

@Dependent 
public class UserScope extends Scope {} 

@Dependent 
@Typed(UserScopeAllowIdEquals.class) // Restrict bean type. 
public class UserScopeAllowIdEquals extends UserScope {} 

は、以下の使用量はのIntelliJに警告検査を引き起こす

しかし 注入点と一致する複数のBean、アプリケーションのコンパイルがありますコンテナはそれを定義エラーとして扱わない。それが書かれている方法に問題はありますか?私は、this answer to a different questionが正しい場合、スーパークラスを含むBeanタイプのBeanが1つしかないことを示すためには、そうではないと思われます。

注:次の使用方法は、Intellij検査の警告を引き起こしません。 CDIに基づいて

public class B { 
    @Inject UserScopeAllowIdEquals usaie; 
} 

答えて

0

、限り豆の複数の実装があるとして、その後、@Default修飾子が適用されなくなりました。

これについては、どのBeanが定義内にあるかを明示的にCDIに伝える必要があります。これはデフォルトBeanです。

@Inject 
private Scope scopeBean; // The @Default annotated, if any of a Scope implementation is used. 
+0

にdefaultを修飾子を追加した後:あなたはScope Beanを注入行うときに、任意の修飾子なし、その後、明示的にデフォルトに指定されたBeanが選択されます

@Dependent @Default public class UserScope extends Scope {} @Dependent @Typed(UserScopeAllowIdEquals.class) // Restrict bean type. public class UserScopeAllowIdEquals extends UserScope {} 

'UserScope'私はまだ' UserScope'を注入する "あいまい依存"警告を受けています。混乱を避けるために、Scopeの基本クラスは抽象クラスなので、スコープは決して挿入しません。 –

+0

@PatrickGarner具体的な実装ではなく、抽象クラスを実際に注入する必要があります – maress

+0

データベーステーブルごとに1つのスコープタイプ、RoleScope、PermissionScope、AcademicYearScope、TransitionLogScopeなどを注入する必要があります。これらのすべてがスコープを拡張します。 UserScopeAllowIdEqualsは束の奇妙な唯一のもので、ScopeではなくUserScopeを拡張しています。 –

関連する問題