4

現在のスコープで使用できる場合にのみフィールドを挿入する必要があり、それ以外の場合は null を挿入する必要があります。例えば:

public class Thinger implements Provider<SomeSuch> {
    public @Inject(optional=true) HttpServletRequest request;        

    public SomeSuch get() {
        return request == null ? new WhosIt() : WhatsIt();
    }
}

ただし、HttpServletRequest がバインドされている (つまり) スコープ内にない場合、ProvisioningException が発生します。私はこれを行うエレガントな方法を見つけることができたので、次のようなことをするように追いやられています。

HttpServletRequest request = null;
try {
    request = injector.getInstance(HttpServletRequest.class);
} catch(ProvisioningException e) {}

これは、あらゆる方法で間違っていると感じています。これを行う適切な方法はありますか?

4

1 に答える 1

3

あなたのクラスが利用可能であることを正確に決定するものは何ですか? HttpServletRequest は、リクエストスコープ以外のサービス内にリクエストがないことはエラーのように聞こえるため、直感に反するものです。

(一般に) 1 つのアイデアは、get/set メソッドだけでホルダーのカスタム プロバイダーを作成することです。プロバイダーでは、Thing が現在のスコープで利用可能かどうかにかかわらず、チェックを実行できます。必要なタイプのホルダーを常に返しますが、利用可能なものによっては空/null になる場合があります。常にホルダーを返すので、インジェクターは問題ないはずです。これを注入するコンポーネントで null をチェックするだけです。

お役に立てれば。

于 2011-01-29T16:24:25.927 に答える