Beginning Java EE 6 勉強会(6) #bje_study
-
Upload
masato-kawamura -
Category
Technology
-
view
2.762 -
download
2
description
Transcript of Beginning Java EE 6 勉強会(6) #bje_study
Beginning Java EE 6 勉強会 (6)-SOAP WEB サービス -
担当者: @masato_kaMasato Kawamura
2012/06/26
2
目次
12/06/27 Beginning JavaEE6 勉強会 (6)
1. SOAP Web サービス
3
第 14 章SOAP Web サービス
12/06/27 Beginning JavaEE6 勉強会 (6)
4
SOAP Web サービス • Web サービスの一種– SOAP, REST(15 章 ), XML-RPC
• 疎結合型の WEB サービス– 開発に使用された言語をしらなくておk– メソッドシグネチャをしらなくておk– 利用できるビジネスメソッドの一目瞭然で知れる– XML 形式でメッセージを送受信する
• HTTP プロトコルを利用する– インターネットや企業のイントラネット内にある
サービスを統合できる( EAI )
12/06/27 Beginning JavaEE6 勉強会 (6)
5
14.1 SOAP Web サービスとは
• 図解!これが SOAP Web サービスだ
12/06/27 Beginning JavaEE6 勉強会 (6)
<<レジストリ>>
UDDI
コンシューマSOAP Webサービス
WEBサービスを利用するクライアント
SOAP Webサービスのアドレスと呼び出し方法を記録している
XML/HTTP
メッセージのリクエストとレスポンスの形式を定義WDSL
SOAP形式でのメッセージをやり
とり
6
XML(Extenblish Markup language)• データの独立性と相互運用性のために利用• SOAP Web サービスの様々な場面で利用する– メッセージ形式– サービス定義 (WSDL)– データの交換 (SOAP)
12/06/27 Beginning JavaEE6 勉強会 (6)
7
WSDL(Web Services Description Language)
• インタフェース定義言語– XML– コンシューマとサービスのやりとりを定義– Java のインタフェース相当を XML で記述
12/06/27 Beginning JavaEE6 勉強会 (6)
クライアント JVM W ebサービスコンテナ
<< コンポーネント>>
コンシューマ
<< コンポーネント>>SOAP Web サービスWSDL
• 次の内容を定義している メッセージタイプ、ポート、通信プロトコル、サポート対象の操作、場所、予想される返値
8
SOAP
• 標準 Web サービスアプリケーションプロトコル
• 整形された XML データ ( 詳細は後ほど )– エンベローブ– ヘッダ– 本文
• HTTP などのネットワークプロトコルを使って交換
• 特定の技術から独立し抽象化された通信プロトコル
12/06/27 Beginning JavaEE6 勉強会 (6)
9
UDDI
• Web サービスの XML ベースレジストリ• Web サービスの場所と呼び出し方法を検出す
る方法を提供する。• そもそも企業間での Web サービスの使い回し
に利用しようとしてたけど、知らない Webサービスを使うケースが少なかったので使われなくなった。
12/06/27 Beginning JavaEE6 勉強会 (6)
10
転送プロトコル
• コンシューマと Web サービスがサポートしてれば転送プロトコルにはこだわらない。
• ` 例えば以下のいずれも利用できる。– HTTP– TCP/IP– SMTP– FTP
12/06/27 Beginning JavaEE6 勉強会 (6)
Webサービスの場合ほとんどが HTTPなのでHTTPを利用するのが標準
11
14.2 SOAP Web サービスの仕様概要
• Web サービスの全体の仕様は多岐にわたる– W3C
• HTML RDF CSS• XML XML スキーマ SOAP WSDL
– OASIS• UUID
• Java EE での仕様 (Java Web Services)– JAX-WS 2.2– Web Service 1.2⇒ 本を参照– JAXB 2.2– WebServices Metadata 2.0⇒ 本を参照– JAXR 1.0⇒ 本を参照
12/06/27 Beginning JavaEE6 勉強会 (6)
12
JAX-WS 2.2
• Web サービス作成の API およびアノテーション– SOAP 経由でのリクエストの送受信機能– プロトコルの複雑さも隠蔽!– 低レベルの処理を受け持ってくれる
• SOAP メッセージの生成と解析をすべて任せられる。
12/06/27 Beginning JavaEE6 勉強会 (6)
13
JAXB 2.2
• XML を Java オブジェクトとして操作できる– API– アノテーション
• マーシャリングとアンマーシャリングが簡単• JAX-WS と統合されているが XML のあらゆる
目的に使えます。
12/06/27 Beginning JavaEE6 勉強会 (6)
14
14.3 SOAP Web サービスを呼び出す方法• 実装はとっても楽ちん!今日から君も SOAPer
12/06/27 Beginning JavaEE6 勉強会 (6)
Web サービス
コンシューマデータオブジェクト
JAX-WS
JAXB
15
14.4 XML バインド用の Java アーキテクチャ
• XML を意識せずにアノテーションのみで実現!– マーシャリング– アンマーシャリング – XML スキーマを自動生成そう、 JAXB ならね!
12/06/27 Beginning JavaEE6 勉強会 (6)
XML XML スキーマ
<xs:complexType…..の xsを名前空間という同じ名称のタグのコンテキスト切り替えられる
例: XMLと XHTMLなど
16
14.4.1 バインド
• JAXB でできること。
12/06/27 Beginning JavaEE6 勉強会 (6)
<xs:schema><xs:element/><xs:complexType><xs:element>・・・・・・・・</xs:sequence></xs:complexType></xs:schema>
<xs:schema><xs:element/><xs:complexType><xs:element>・・・・・・・・</xs:sequence></xs:complexType></xs:schema>
<xs:schema><xs:element/><xs:complexType><xs:element>・・・・・・・・</xs:sequence></xs:complexType></xs:schema>
<CreditCard><controlNumber><expiryDate><number><type>VISA</type></CreditCard>
XML Schema クラス
オブジェクトXML オブジェクト
スキーマコンパイラ (xjc)
スキーマコンジェネレータ(schemagen)
アンマーシャリング
マーシャリング
17
マーシャリング
• マーシャリングもとっても簡単
– アンマーシャリングもほぼ同じ
12/06/27 Beginning JavaEE6 勉強会 (6)
18
JAXB でバインドを行う2つのシナリオ
• xjc や schemaGen といったツールがある• Java クラス– Java クラスが存在する場合に XML スキーマを生成– Web サービスは WSDL を生成できる
• XML スキーマ– XML スキーマが存在する場合に、スキーマコンパ
イラを使用して Java クラスを生成– WSDL からクラスを生成することができる
12/06/27 Beginning JavaEE6 勉強会 (6)
19
JAXB のアノテーション
• JAXB も JPA 同様にアノテーションでマッピングをカスタマイズ可能– 詳しくは表 14-1 参照
12/06/27 Beginning JavaEE6 勉強会 (6)
20
演習1
• Chapter14 のサンプルプロジェクトを読み込み– 次のコードを確認してみよう
• WEB サービス• CreditCard クラス• コンシューマ• マーシャリング• CreditCard クラス(アノテーション)
• Consumer Service のどちらにあるでしょう?
12/06/27 Beginning JavaEE6 勉強会 (6)
21
14.5 内部動作
• WDSL を使用してインタフェース定義• SOAP は WSDL にあわせたメッセージを送信
12/06/27 Beginning JavaEE6 勉強会 (6)
クライアント JVM W ebサービスコンテナ
<< コンポーネント>>
コンシューマ
<< コンポーネント>>SOAP Web サービス
WSDLSOAP/HTTP
22
WSDL
• Web サービスのコンテナでホストされる• XML 形式で次の内容を記述している– サービスの処理内容– 操作の呼び出し方法– サービスの所在
12/06/27 Beginning JavaEE6 勉強会 (6)
23
WSDL の XML 要素の紹介
• 実際に WDSL をみながら確認してみよう。– 詳しくは演習2で
12/06/27 Beginning JavaEE6 勉強会 (6)
XML要素 説明<definitions> WSDLのルート要素、ドキュメント全体で参照可能な名前
空間のグローバル宣言を定義<types> メッセージで使用するデータ型を定義。先ほどの例では、
Webサービスリクエスト (CreditCardオブジェクト )とレスポンス (Boolean)に渡すパラメーターを表す XML(スキーマ定義 )
<message> Webサービスのコンシューマと Webサービス自体の間で交換されるデータの形式を定義。(例:リクエストとレスポンス)
<portType> Webサービスの操作を指定。<binding> 具体的なプロトコルと、特定のポート種類に定義される
操作とメッセージのデータ形式を表す。<service> 各ポートがエンドポイントと関連図蹴られている <port>
要素のコレクションを含む
24
SOAP
• 交換するメッセージの XML構造• HTTP リクエストで XML メッセージを送信• Envelope と Body は必須
12/06/27 Beginning JavaEE6 勉強会 (6)
XML要素 説明<Envelope> ドキュメントで使用するメッセージと名前空間を
定義。必須のルート要素。<Header> メッセージまたはアプリケーション固有のインフ
ラストラクチャのオプション属性を含む。<Body> アプリケーション間で交換されるメッセージを含
む。<Fault> メッセージ処理中に発生したエラーについての情
報を提供。
25
SOAP メッセージの例
• リクエストの SOAP エンベローブ
12/06/27 Beginning JavaEE6 勉強会 (6)
<soap:Envelope xmlns:soap=“http://schemas.xmlsoap.org/envelope/” xmlns:cc=“http://chapter14.javaee6.org/”> <soap:Header/> <soap:Body> <cc:validate> <arg0> <controlNumber>1234</controlNumber> <expiryDate>10/10</expireDate> <number>9999</number> <type>VISA</type> </arg0> </cc:validate> </soap:Body></soap:Envelope>
メッセージ(クレジットカード)
Envelopeと名前空間
26
演習2 WSDL をのぞいちゃおう
• Chapter14 のサーバを GlassFish にデプロイ• ポート 4848 の管理画面からアプリケーショ
ンを選択し CardValidator のエンドポイントを選択
12/06/27 Beginning JavaEE6 勉強会 (6)
27
14.6 Java API for XML-Based Web Services
• JAX-WS が WSDL などの複雑さを隠蔽してくれるが、 Java コードを書くときに直接参照、解析をしなければいけない場合がある。– トップダウンアプローチ
• WSDL の定義を作成し、クラスを実装する– ボトムアップアプローチ
• 既存のクラスを WSDL に変換する。
• WSDL に適合させるため、コードの調整が必要
それ、 JAX-WS が提供するアノテーションで実現できるよ?※それ以外にも wsimport というツールもある。12/06/27 Beginning JavaEE6 勉強会 (6)
28
14.6.1 JAX-WSモデル
• Web サービス化の要件– クラスには@javax.jws.WebServiceアノテーショ
ンを付加するか同等の XML ディスクリプタを使用– Web サービスを EJB エンドポイントにする場合、
クラスに@javax.ejb.Statelessアノテーションを付加する必要がある。
– クラスを public で定義 final abstruct 定義は不可– クラスはデフォルトのパブリックコンストラクタ
が必要– クラスは finalize() メソッドの実装は不可– サービスはステートレスオブジェクトとして実装。
複数回のメソッド呼び出し間にクライアント固有の状態を保存しない。
12/06/27 Beginning JavaEE6 勉強会 (6)
29
Web サービスのエンドポイント
• JAX-WS2.2 POJO とステートレス EJB の両方を WEB サービスで公開できる。– コードの違いはない( @Stateless の違いのみ)
• EJB を使った場合のメリット– セキュリティとコンテナ管理のトランザクション– インターセプタ利用可能– ビジネスコードを EJB Web サービスとして公開で
きる。
12/06/27 Beginning JavaEE6 勉強会 (6)
クラス パッケージ化 デプロイ場所POJO .war(サーブレットエンドポイン
ト )サーブレットコンテナ
EJB .jar(EJBエンドポイント ) EJBコンテナ
30
JAX-WS のアノテーション
• Java オブジェクトから SOAPへの変換が必要– WSDL(JAXB) 同様アノテーションを利用する。
• WSDL のマッピングアノテーション– javax.jws パッケージに属している– WSDL と Java 間のマッピングを変更可能
• SOAP バインディングアノテーション– Javax.jws.soap パッケージに属している– SOAP バインドのカスタマイズが可能
12/06/27 Beginning JavaEE6 勉強会 (6)
31
@WebService
• クラスをウェブサービスにする。• WDSL ファイルに関するカスタマイズが可能– WSDL の Web サービス名– 名前空間のカスタマイズ– WDSL 自体の場所の変更
• クラスにアノテーションするとコンテナがインタフェースを生成する。
• インタフェースに付加してクラスで実装することもできる。
12/06/27 Beginning JavaEE6 勉強会 (6)
32
@WebMethod
• デフォルトではクラスのパブリックメソッドがすべて WSDL で公開される。 WSDLへのマッピングをカスタマイズする– マッピングした際のメソッド名の変更– WSDL からメソッドの除外を可能とする
12/06/27 Beginning JavaEE6 勉強会 (6)
33
@WebResult 、 @WebParam
• @WebResult– @WebMethod と連携して WSDL でメソッドの戻
り値につけられる名前を制御する。• @WebParam– @WebResult と同様に、メソッドに渡すパラメー
タのカスタマイズが可能となる。
12/06/27 Beginning JavaEE6 勉強会 (6)
34
@OneWay
• 戻り値がない (void) メソッドに使用する。– 非同期呼び出しなど– 呼び出しを最適化することができる。
12/06/27 Beginning JavaEE6 勉強会 (6)
35
ライフサイクルとコールバック
• 存在しない状態と準備状態の2種類• @PostConstruct と @PreDestroy
12/06/27 Beginning JavaEE6 勉強会 (6)
存在しない状態
準備状態
@PostConstruct @PreDestroy
メソッド呼び出し
36
Web サービスコンテキスト
• Web サービスの環境コンテキストにアクセスできる– エンドポイント実装クラス– メッセージ・コンテキスト– 現在処理中のリクエストに関わるセキュリティ情報
など– @ Resource アノテーションで
WebServiceContext を注入する
12/06/27 Beginning JavaEE6 勉強会 (6)
37
WebServiceContext のメソッドメソッド 説明getMessageContext このメソッドが呼び出されたときに
処理中のリクエストのMessageContextを返す。これは、 SOAPメッセージのヘッダーや本文などにアクセスするために使用可能
getUserPrincipal 現在調整中のリクエストの送信元を識別する Principalを返す
isUserInRole 認証済みのユーザーが指定された論理ロールに含まれているかどうかを示す boolean値を返す
getEndpointReference このエンドポイントに関連するEndpointReferenceを返す。
12/06/27 Beginning JavaEE6 勉強会 (6)
38
演習3 JAX-WS アノテーション
• Ex16 のソースコードと WSDL をのぞいてみましょう!
• アノテーションから WSDL の記述を予想しよう!
• @WebService のはどこについてますか?– クラス or インタフェース
• @WebService を付加する場所を変えてWSDL を確認してみよう。
12/06/27 Beginning JavaEE6 勉強会 (6)
39
SOAP Web サービスの呼び出し
• サービスエンドポイントインタフェース( SEI )– WSDL から生成された Java インタフェース– HTTP を使用してローカル Java 呼び出しをリモー
トの Web サービスにルーティングする– SEI からプロキシクラスを取得する。
12/06/27 Beginning JavaEE6 勉強会 (6)
クライアント JVM W ebサービスコンテナ
<< コンポーネント>>
コンシューマ
<< コンポーネント>>SOAP Web サービス
WSDL
SOAP/HTTP << コンポーネント >>
SOAP Web サービスのエンドポイント
<< コンポーネント>>コンシューマプロキシ
Java インタフェース
Java インタフェース
40
プロキシの取得
• アノテーション @WebServiceRef– コンテナ内で実行しない場合は使えない
• wsimport ツールによって生成されるクラスを利用– GlassFish や JDK に同梱されている
12/06/27 Beginning JavaEE6 勉強会 (6)
ローカルクラスと同じように記述するが、 SEI が Web サービスにルーティングしている。
41
演習4クライアントを動かす!
• まずはサーバを停止した状態で、クライアントをビルドしよう。なぜビルドが失敗したか?– たぶん本来であれば ex04,ex08 はビルドで
きるはず。• サーバを立ち上げてビルドしよう!– クライアント側の pom ファイルに WSDL を設定
する必要があります。
• それぞれのサンプルの結果を確認してみよう!
12/06/27 Beginning JavaEE6 勉強会 (6)
42
まとめ
• SOAP Web サービスの概要– 関連技術– SOAP を使った Web サービスの呼び出し方法
• JAXB– オブジェクトと XML のバインド– スキーマとクラスのバインド
• Web サービスの内部動作• JAX-WS
12/06/27 Beginning JavaEE6 勉強会 (6)