8

多かれ少なかれ次のように見える Metro jax-ws Web サービスがあります。

@WebService
@Transactional
public class UserManagementServiceImpl {

    @Resource
    private WebServiceContext context;

    ...
}

WebServiceContext常に null です。ただし、削除@Transactionalすると WebServiceContext が注入されます。

誰もが回避策を知っていますか?

ありがとう。

4

3 に答える 3

5

回避策を見つけました。フィールドインジェクションの代わりにセッターインジェクションを使用します。

@WebService
@Transactional
public class UserManagementServiceImpl {

    private WebServiceContext context;

    @Resource
    public void setContext(WebServiceContext context) {
        this.context = context;
    }
    ...
}
于 2011-04-28T20:37:02.657 に答える
3

Webサービスとトランザクション管理の問題は、それぞれがクラスのプロキシを作成し、プロキシを作成する2番目のプロキシは実際の実装ではなく、プロキシを取得することです(そして物事は南に進みます)。

これを回避する方法は、Webサービスエンドポイント実装からのすべての呼び出しをサービスに委任することです。したがって、2つの具体的なクラスが必要になります:S。

これが最善の方法かどうかはわかりませんが、私が見つけた中で最高の方法です。

また、ユーザーマネージャーがWebサービスを気にかけているように見えるため、コードが少しクリーンアップされる可能性がありますが、これは正しく表示されません。

于 2011-04-28T15:35:11.553 に答える
2

サーブレットはシングルトンであるため、Web サービスへの同時呼び出しを処理するときに問題が発生する可能性があると思われます。すべてのインスタンス データはすべてのスレッドによって「共有」されるため、「プライベート コンテキスト」は次の呼び出しによってオーバーライドされ続けます。前の通話でまだビジーです。多分何かのような

ThreadLocal<WebServiceContext> WSS = new ThreadLocal<WebServiceContext>();

@Resource
public void setContext(WebServiceContext context) {
    WSS.set(context);
}

// then where you need the context use WSS.get();
于 2014-07-15T10:50:02.980 に答える