2010-12-03 19 views
1

トランザクションではないWebサービスとしてEJBを公開するにはどうすればよいですか?

次のように定義されたEJB(Java EE 6注釈を使用してコード化されている)があります。

@Stateless 
@WebService 
public class SecurityWebService { 

    public void registerUser(RegistrationRequest request) { 
     ... 
    } 
} 

このEJBもWebサービスとして公開されています。しかし、私は生成されたWebサービスの問題に遭遇しています。私のコンテナ(GlassFish)によって生成されるWSDLには、デフォルトでステートレスセッションBeanがトランザクション型であるため、WS-Atomic Transactionポリシーが含まれています(詳細はhereを参照)。残念ながら、.NETクライアントはWS-ATポリシーを理解していないため、WSDLで窒息しています。

だから私が本当に望むのは、きれいでクリーンなWebサービスで、トランザクションではないが、関連するEJBはトランザクションでなければならない(データベースにレコードを挿入する必要がある)。これはどうすればいいですか?私が考えることができる唯一のアプローチは、このようなEJBにすべての呼び出しを渡す "通常の" Webサービスを作成することです - 上品ではない:

@WebService 
public class SecurityWebService { 

    @Inject 
    private SecurityService securityService; 

    public void registerUser(RegistrationRequest request) { 
     securityService.registerUser(request); 
    } 
} 

@Stateless 
public class SecurityService { 

    public void registerUser(RegistrationRequest request) { 
     ... 
    } 
} 

もっと良い方法はありますか?

ありがとう。

Naresh

+0

あなたのソリューションはなぜエレガントではありませんか?これは、責任の明確な分離です。非トランザクションWebサービスは、トランザクションEJBとは異なる責任を負う。また、後で簡単に変更することもできます。 – jhyot

答えて

0

:Webサービス場合

@TransactionAttribute(TransactionAttributeType.NEVER) 

または

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 

知らんはそれを拾うかどうか、それはショットの価値があるだろう。コメントを

編集:

あなたはREQUIRES_NEWを試してみましたか?彼らは、Webサービスに戻って伝播していない可能性があります。

そうでなければ、非トランザクションのWebサービスでトランザクション部分を覆い隠すことになります。

+0

WS-ATポリシーはWSDLから削除されていますが、私のEJBが非トランザクションになってしまうという副作用があります。上で述べたように、このBeanはデータベーストランザクションを実行する必要があるため、トランザクション処理が必要です。 – Naresh

+0

次に、トランザクションをBean管理トランザクションにします。あなたのentitymanagerからトランザクションオブジェクトを取得し、トランザクションを開始し、db作業を行い、トランザクションをコミットします。 Bean管理トランザクションを使用するWebサービスEJBに注釈を付けることを忘れないでください –

関連する問題