2017-10-01 17 views
0

現在、我々は、「プロセッサ」と呼ばれるWebサービスリクエストを処理するための精巧なPOJOオブジェクト構造を持っています。ステートレスセッションBeansリクエストでCDIを挿入

このリクエストの処理中に呼び出されるリモートEJBとローカルEJBは、ステートレスBeanで初期化され、各Webサービス要求中に再作成されるこの「プロセッサ」コンストラクタに渡されます。

私は深いダウン私の「プロセッサ」でJNDIルックアップに戻したくない場合

は、私は私のコードを介してすべてのこれらのEJBの周りをドラッグし続けます。

CDIと入力します。これらのEJBを私がこの「プロセッサ」に必要とする度に注入できるようにしたいと思います。

しかし、これは、現在の 'プロセッサ'がCDI Beanになる必要があることにも気付きました。つまり、Webサービスを実装するステートレスセッションBeanの@Injectを使用します。

私は、このプロセッサのentiryライフサイクル行う

は、そのサービスBeanにしていない要求に結合するようになります。

突然私はこの状態が複数のWebサービス呼び出しの間で共有されるので、私は、プロセッサ内(注入オブジェクト以外の)状態を維持するべきではない考慮しなければなりません。プログラマーとして、これは私の人生をより簡単にしていません。

So:どうすればいいですか?私はスコープについて読んだことがありますが、これが私を助けてくれるかどうかはわかりません。

例、ステートレスビーン:

@Stateless 
@WebService 
public class ExampleBean { 

    @Inject 
    Processor requestScopedInstance; 

    int beanDependentScopeCounter; 

    public String sayHello() { 
     System.out.println("bean object id: " + this.toString()); 
     return requestScopedInstance.sayHello(beanDependentScopeCounter++); 
    } 
} 

インタフェース:

public interface Processor { 

    String sayHello(int beanScopedCounter); 
} 

実装:

public class ProcessorImpl implements Processor { 

    private int requestScopedCounter = 0; 

    @Override 
    public String sayHello(int beanScopedCounter) { 
     return "test, requestScoped: " + requestScopedCounter++ + ", beansScoped: " + beanScopedCounter; 
    } 

} 

答えて

1

When I do this the entiry lifecycle of the processor becomes bound to the bean and not to the request its serving正しくありません。これは、@ApplicationScoped、@ SessionScoped、@RequestScopedを使用しない場合に限られます。

ので:

  • @RequestScopedであなたのプロセッサに注釈を付けます。
  • EJBを引き渡す必要はありません。必要に応じて、EJBを注入するだけで済みます。
  • 注入オブジェクトを使用するコンストラクタコードの注釈付きメソッドを@PostConstructに使用してください。
  • ステートレスPOJOには@ApplicationScopedという注釈を付けることができますが、ステートレスPOJOはデフォルトである依存スコープを維持することはできません。プロキシが注入されているので可能となる

ではなく、実際の豆。これらのプロキシを使用すると、特定のコールに正しいスコープが使用されます。

+0

ありがとう..私は例を追加しました。単に 'ProcessorImpl'の上に' @ RequestScope'を追加するだけで私の問題が解決されました。 – sjaak

関連する問題