2011-10-17 9 views
1

私はWebサービスにspring-wsを使用していますが、同じ初期要求に対して異なる応答を返す方法を見つけることはできません。ちょうど私が特定のタイプのリクエストを取得したとしましょう、我々はそれをFindGasRequestと呼ぶでしょう。 FindGasRequestが来たら正しいエンドポイントにマップしてから、ビジネスロジックを実行してからFindGasResponseを返すように、私はすでにエンドポイントマッピングを適切に設定しています。spring-wsが別の種類を返す

ここに私の質問です。 FindGasRequestを取得した後、ビジネスロジックで、FindGasResponseを返す代わりに、ListGasStationsResponseを返すことを決定します。 @PayloadRootでマークされたメソッドがFindGasResponseを予期している場合、どうすればよいでしょうか?私はペイロードを何か他のものに変えることはできますか?

私は例外をスローできるようにエラーチェックを設定していますが、FindGasErrorResponseと例外ハンドラを返します。だから私の最初の考えは何か似たようなことをすることでしたが、エラーが発生していないときには例外をスローするのはむしろ面倒です。

+0

Javaで十分に単純なように見えますが、問題はその構造を反映するXSDがあることです。リストには1つ以上のFindGasResponse要素を含めることができるので、私が思いつくことができるベストは(あなたの例に基づいて)常にリストを返すことです。 – evandongen

答えて

2

醤油、クライアントとあなたのメッセージスキーマと契約を想定し

がFindGasRequestに応じてListGasStationsResponseまたはFindGasResponseを返すことができます、あなたは、アノテーションベースのFindGasエンドポイントを放棄する必要があり、代わりに自分のエンドポイントを作ってあげますAbstractMarshallingPayloadEndpointを継承します。

次に、2つの異なる応答タイプのいずれかをObjectとして返すには、AbstractMarshallingPayloadEndpoint.invokeInternalを上書きする必要があります。あなたのマーシャラー(これはJaxb2Marshallerと一緒に私のために働く)は、自動的にそのObjectを取得し、それらのタイプの1つに対してXMLレスポンスを作成する必要があります。

注釈ベースとxml構成のエンドポイントが混在している場合があります。その場合は、こちらの手順に従って、それらのマッピングを設定する必要があります。http://forum.springsource.org/showthread.php?78685-Mixing-annotations-with-xml-configuration-of-endpoints

このアプローチはSpring-WS 1.5で役に立ちました。

+0

は魅力的に働いた!! – sauce

関連する問題