10

JSR-299 仕様では、§3.1 で次のように述べています。

マネージド Bean クラスがジェネリック型の場合、スコープ @Dependent が必要です。パラメーター化された Bean クラスを持つマネージド Bean が @Dependent 以外のスコープを宣言する場合、コンテナーは自動的に問題を検出し、定義エラーとして扱います。

これを行うことができないという事実上の意味:

@Named
@SessionScoped or @RequestScoped or similar
public class MyProducer<T> {...}

この決定の技術的な理由は何ですか?

ひょっとして CDI の今後のバージョンで修正されるのでしょうか?

これに対処/回避するためのベストプラクティスはありますか?

ありがとうございました

編集- 私がよく使用できる回避策は、必要なスコープを持つ Bean にジェネリック POJO Bean を注入することです。多くの場合、常にではありません。

4

2 に答える 2

17

一般的な非依存 Bean クラスを次に示します。

@ApplicationScoped
public class FavouriteChooser<T> {
    public T getFavourite() {
        // ...
    }
}

アプリケーションには、この Bean のインスタンスがいくつありますか?

注射部位はこちら

@Inject
private FavouriteChooser<String> favouriteWord;

そして、ここに別のものがあります:

@Inject
private FavouriteChooser<Integer> favouriteNumber;

答えを変更しますか?:D

ああ、ここに別のものがあります:

@Inject
private FavouriteChooser<CharSequence> favouriteLetters;

編集。解決策が必要な場合は、ジェネリック クラスを抽象化し、型をバインドする具体的なサブクラスを追加することをお勧めします。そう:

public abstract class MyProducer<T> {...}

@Named
@SessionScoped
public class MyStringProducer extends MyProducer<String> {}

@Named
@SessionScoped
public class MyIntegerProducer extends MyProducer<Integer> {}

ボイラープレートですが、1 種類につき 3 行しかありません。タイプごとにセッションごとに1つのインスタンスが得られることに注意してください。これは望ましくない場合があります。

于 2012-06-21T15:37:45.527 に答える
2

すべての非依存スコープ Bean はプロキシする必要があります-私の知る限り、これはジェネリック型では不可能です。

アップデート:

もっと詳しく説明したいのですが、そうではありません ;-) Weld はjavassistを使用しており、ジェネリック型のプロキシは原則として可能であると述べていますが、トップレベル API では直接サポートされていません。しかし、私たちは仕様について話しているのであって、Weld の実装について話しているのではありません...

たぶん、他の誰かがギャップを埋めることができますか?

于 2012-06-21T14:42:18.490 に答える