Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Beginning Java EE 6 勉強会(6) #bje_study

4,037 views

Published on

Beginning Java EE 6 の14章SOAP WEBサービスの資料です。

Published in: Technology
  • Be the first to comment

Beginning Java EE 6 勉強会(6) #bje_study

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

×