2009年11月14日土曜日

WS-Addressing/CXF 2.2.4

前回のポストで、ある文字列を渡すと、それを加工して別の文字列を返すWeb サービスを作った。これに WS-Addressing を追加してみる。 (作業環境は前回同様 Galileo + Tomcat v6.0。CXF 2.2.4 は Web service runtime として使用。) もともとのSOAPメッセージは、こんなリクエストとレスポンスだった。 ◆リクエスト
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:greet xmlns:ns2="http://mycompany.com/greeting/">
      <username>World</username>
    </ns2:greet>
  </soap:Body>
</soap:Envelope>
◆レスポンス
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:greeting-response xmlns:ns2="http://mycompany.com/greeting/">
      <return>Hello, World!</return>
    </ns2:greeting-response>
  </soap:Body>
</soap:Envelope>
これが、WS-Addressing を使うと、ヘッダのところがこんな風になる。 ◆リクエスト
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <Action xmlns="http://www.w3.org/2005/08/addressing">
      http://mycompany.com/greeting/Greeting/greet
    </Action>
    <MessageID xmlns="http://www.w3.org/2005/08/addressing">
      urn:uuid:364e3949-e49a-44e7-a6c9-843ac2acce3c
    </MessageID>
    <To xmlns="http://www.w3.org/2005/08/addressing">
      http://localhost:8080/cxf-trial1/services/GreetingPort
    </To>
    <ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
      <Address>
        http://www.w3.org/2005/08/addressing/anonymous
      </Address>
    </ReplyTo>
  </soap:Header>
  <soap:Body>
  ・・・
◆レスポンス
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <Action xmlns="http://www.w3.org/2005/08/addressing">
      http://mycompany.com/greeting/Greeting/response
    </Action>
    <MessageID xmlns="http://www.w3.org/2005/08/addressing">
      urn:uuid:764d8c64-d8fb-46ba-8bee-d86761386b8d
    </MessageID>
    <To xmlns="http://www.w3.org/2005/08/addressing">
      http://www.w3.org/2005/08/addressing/anonymous
    </To>
    <RelatesTo xmlns="http://www.w3.org/2005/08/addressing">
      urn:uuid:364e3949-e49a-44e7-a6c9-843ac2acce3c
    </RelatesTo>
  </soap:Header>
  <soap:Body>
  ・・・
リクエストに返信先を示す<ReplyTo>が含まれ、レスポンスにはもともとのメッセージを識別するIDが含まれているのがわかる。 このための作業は、CXF 的には Feature と言うものを指定して行うらしい。例えば今回は、サービス側のエンドポイントを beans.xml で構成したけど、その jaxws:endpoint で以下のように Feature を追加する。
    <jaxws:features>
      ・・・
        <wsa:addressing xmlns:wsa="http://cxf.apache.org/ws/addressing"/>
    </jaxws:features>
またクライアント側は 非 Spring の Java コードで書いたけど、その場合こんな風にFeature を追加する。
    factory.getFeatures().add(new WSAddressingFeature());
Eclipse の Type Hierarchy で見ると、WSAddressingFeature の他に、LoggingFeature や WS-Policy などの AbstractFeature の派生クラスが12個ほどあるらしい。 今回は WS-Addressing の細部にまで深入りできないけど、何となく CXF の作法がわかってきた。beans.xml で Feature を付与するようにして、サービス実装クラス(ビジネスロジック)への変更を拝するというのは、これも separation of concern の良い例だなあと思う。 他にも WS-* 関連の CXF 実装を調べて見たいが、思ったより資料が少なくて難しい。

0 件のコメント:

コメントを投稿