前回のポストで、ある文字列を渡すと、それを加工して別の文字列を返す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 件のコメント:
コメントを投稿