2011-01-12 16 views
4

フィールドを現在のスコープで使用できる場合にのみ注入する必要があります。たとえば、次のようにオプションGuiceのスコープ付き注入

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) {} 

ちょうどすべてのやり方が間違っていると感じます。これを行う適切な方法はありますか?

答えて

3

クラスを使用できるようにする正確な条件は何ですか? HttpServletRequestは何とか私には直観的ではありません。リクエストスコープのないサービス内にリクエストを持たないのは、私にとってはエラーのようです。

1つの考え方は、(一般的に)ちょうどget/setメソッドを使用してHolderのカスタムプロバイダを記述することです。プロバイダでは、現在のスコープで使用可能かどうかにかかわらず、チェックを実行できます。必要なタイプのホルダーが常に返されますが、使用可能なものによっては空でもnullでもかまいません。あなたは常にホルダーを返すので、インジェクターは大丈夫です。これを注入するコンポーネントでnullをチェックするだけで済みます。

これが役に立ちます。

+0

私たちが1つのスコープの「内側」にいるかどうかを確認するにはどうすればよいですか? – BrunoJCM

関連する問題