beginning java ee 6 勉強会(6) #bje_study

42
Beginning Java EE 6 勉勉勉 (6) -SOAP WEB 勉勉勉勉 - 担担担@masato_ka Masato Kawamura 2012/06/26

Upload: masato-kawamura

Post on 31-May-2015

2.762 views

Category:

Technology


2 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Beginning Java EE 6 勉強会(6) #bje_study

Beginning Java EE 6 勉強会 (6)-SOAP WEB サービス -

担当者: @masato_kaMasato Kawamura

2012/06/26

Page 2: Beginning Java EE 6 勉強会(6) #bje_study

2

目次

12/06/27 Beginning JavaEE6 勉強会 (6)

1. SOAP Web サービス

Page 3: Beginning Java EE 6 勉強会(6) #bje_study

3

第 14 章SOAP Web サービス

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 4: Beginning Java EE 6 勉強会(6) #bje_study

4

SOAP Web サービス • Web サービスの一種– SOAP, REST(15 章 ), XML-RPC

• 疎結合型の WEB サービス– 開発に使用された言語をしらなくておk– メソッドシグネチャをしらなくておk– 利用できるビジネスメソッドの一目瞭然で知れる– XML 形式でメッセージを送受信する

• HTTP プロトコルを利用する– インターネットや企業のイントラネット内にある

サービスを統合できる( EAI )

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 5: Beginning Java EE 6 勉強会(6) #bje_study

5

14.1 SOAP Web サービスとは

• 図解!これが SOAP Web サービスだ

12/06/27 Beginning JavaEE6 勉強会 (6)

<<レジストリ>>

UDDI

コンシューマSOAP Webサービス

WEBサービスを利用するクライアント

SOAP Webサービスのアドレスと呼び出し方法を記録している

XML/HTTP

メッセージのリクエストとレスポンスの形式を定義WDSL

SOAP形式でのメッセージをやり

とり

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

6

XML(Extenblish Markup language)• データの独立性と相互運用性のために利用• SOAP Web サービスの様々な場面で利用する– メッセージ形式– サービス定義 (WSDL)– データの交換 (SOAP)

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 7: Beginning Java EE 6 勉強会(6) #bje_study

7

WSDL(Web Services Description Language)

• インタフェース定義言語– XML– コンシューマとサービスのやりとりを定義– Java のインタフェース相当を XML で記述

12/06/27 Beginning JavaEE6 勉強会 (6)

クライアント JVM W ebサービスコンテナ

<< コンポーネント>>

コンシューマ

<< コンポーネント>>SOAP Web サービスWSDL

• 次の内容を定義している メッセージタイプ、ポート、通信プロトコル、サポート対象の操作、場所、予想される返値

Page 8: Beginning Java EE 6 勉強会(6) #bje_study

8

SOAP

• 標準 Web サービスアプリケーションプロトコル

• 整形された XML データ ( 詳細は後ほど )– エンベローブ– ヘッダ– 本文

• HTTP などのネットワークプロトコルを使って交換

• 特定の技術から独立し抽象化された通信プロトコル

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 9: Beginning Java EE 6 勉強会(6) #bje_study

9

UDDI

• Web サービスの XML ベースレジストリ• Web サービスの場所と呼び出し方法を検出す

る方法を提供する。• そもそも企業間での Web サービスの使い回し

に利用しようとしてたけど、知らない Webサービスを使うケースが少なかったので使われなくなった。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 10: Beginning Java EE 6 勉強会(6) #bje_study

10

転送プロトコル

• コンシューマと Web サービスがサポートしてれば転送プロトコルにはこだわらない。

• ` 例えば以下のいずれも利用できる。– HTTP– TCP/IP– SMTP– FTP

12/06/27 Beginning JavaEE6 勉強会 (6)

Webサービスの場合ほとんどが HTTPなのでHTTPを利用するのが標準

Page 11: Beginning Java EE 6 勉強会(6) #bje_study

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)

Page 12: Beginning Java EE 6 勉強会(6) #bje_study

12

JAX-WS 2.2

• Web サービス作成の API およびアノテーション– SOAP 経由でのリクエストの送受信機能– プロトコルの複雑さも隠蔽!– 低レベルの処理を受け持ってくれる

• SOAP メッセージの生成と解析をすべて任せられる。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 13: Beginning Java EE 6 勉強会(6) #bje_study

13

JAXB 2.2

• XML を Java オブジェクトとして操作できる– API– アノテーション

• マーシャリングとアンマーシャリングが簡単• JAX-WS と統合されているが XML のあらゆる

目的に使えます。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 14: Beginning Java EE 6 勉強会(6) #bje_study

14

14.3 SOAP Web サービスを呼び出す方法• 実装はとっても楽ちん!今日から君も SOAPer

12/06/27 Beginning JavaEE6 勉強会 (6)

Web サービス

コンシューマデータオブジェクト

JAX-WS

JAXB

Page 15: Beginning Java EE 6 勉強会(6) #bje_study

15

14.4 XML バインド用の Java アーキテクチャ

• XML を意識せずにアノテーションのみで実現!– マーシャリング– アンマーシャリング – XML スキーマを自動生成そう、 JAXB ならね!

12/06/27 Beginning JavaEE6 勉強会 (6)

XML XML スキーマ

<xs:complexType…..の xsを名前空間という同じ名称のタグのコンテキスト切り替えられる

例: XMLと XHTMLなど

Page 16: Beginning Java EE 6 勉強会(6) #bje_study

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)

アンマーシャリング

マーシャリング

Page 17: Beginning Java EE 6 勉強会(6) #bje_study

17

マーシャリング

• マーシャリングもとっても簡単

– アンマーシャリングもほぼ同じ

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 18: Beginning Java EE 6 勉強会(6) #bje_study

18

JAXB でバインドを行う2つのシナリオ

• xjc や schemaGen といったツールがある• Java クラス– Java クラスが存在する場合に XML スキーマを生成– Web サービスは WSDL を生成できる

• XML スキーマ– XML スキーマが存在する場合に、スキーマコンパ

イラを使用して Java クラスを生成– WSDL からクラスを生成することができる

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 19: Beginning Java EE 6 勉強会(6) #bje_study

19

JAXB のアノテーション

• JAXB も JPA 同様にアノテーションでマッピングをカスタマイズ可能– 詳しくは表 14-1 参照

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 20: Beginning Java EE 6 勉強会(6) #bje_study

20

演習1

• Chapter14 のサンプルプロジェクトを読み込み– 次のコードを確認してみよう

• WEB サービス• CreditCard クラス• コンシューマ• マーシャリング• CreditCard クラス(アノテーション)

• Consumer Service のどちらにあるでしょう?

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 21: Beginning Java EE 6 勉強会(6) #bje_study

21

14.5 内部動作

• WDSL を使用してインタフェース定義• SOAP は WSDL にあわせたメッセージを送信

12/06/27 Beginning JavaEE6 勉強会 (6)

クライアント JVM W ebサービスコンテナ

<< コンポーネント>>

コンシューマ

<< コンポーネント>>SOAP Web サービス

WSDLSOAP/HTTP

Page 22: Beginning Java EE 6 勉強会(6) #bje_study

22

WSDL

• Web サービスのコンテナでホストされる• XML 形式で次の内容を記述している– サービスの処理内容– 操作の呼び出し方法– サービスの所在

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 23: Beginning Java EE 6 勉強会(6) #bje_study

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>

要素のコレクションを含む

Page 24: Beginning Java EE 6 勉強会(6) #bje_study

24

SOAP

• 交換するメッセージの XML構造• HTTP リクエストで XML メッセージを送信• Envelope と Body は必須

12/06/27 Beginning JavaEE6 勉強会 (6)

XML要素 説明<Envelope> ドキュメントで使用するメッセージと名前空間を

定義。必須のルート要素。<Header> メッセージまたはアプリケーション固有のインフ

ラストラクチャのオプション属性を含む。<Body> アプリケーション間で交換されるメッセージを含

む。<Fault> メッセージ処理中に発生したエラーについての情

報を提供。

Page 25: Beginning Java EE 6 勉強会(6) #bje_study

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と名前空間

Page 26: Beginning Java EE 6 勉強会(6) #bje_study

26

演習2 WSDL をのぞいちゃおう

• Chapter14 のサーバを GlassFish にデプロイ• ポート 4848 の管理画面からアプリケーショ

ンを選択し CardValidator のエンドポイントを選択

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 27: Beginning Java EE 6 勉強会(6) #bje_study

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)

Page 28: Beginning Java EE 6 勉強会(6) #bje_study

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)

Page 29: Beginning Java EE 6 勉強会(6) #bje_study

29

Web サービスのエンドポイント

• JAX-WS2.2 POJO とステートレス EJB の両方を WEB サービスで公開できる。– コードの違いはない( @Stateless の違いのみ)

• EJB を使った場合のメリット– セキュリティとコンテナ管理のトランザクション– インターセプタ利用可能– ビジネスコードを EJB Web サービスとして公開で

きる。

12/06/27 Beginning JavaEE6 勉強会 (6)

クラス パッケージ化 デプロイ場所POJO .war(サーブレットエンドポイン

ト )サーブレットコンテナ

EJB .jar(EJBエンドポイント ) EJBコンテナ

Page 30: Beginning Java EE 6 勉強会(6) #bje_study

30

JAX-WS のアノテーション

• Java オブジェクトから SOAPへの変換が必要– WSDL(JAXB) 同様アノテーションを利用する。

• WSDL のマッピングアノテーション– javax.jws パッケージに属している– WSDL と Java 間のマッピングを変更可能

• SOAP バインディングアノテーション– Javax.jws.soap パッケージに属している– SOAP バインドのカスタマイズが可能

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 31: Beginning Java EE 6 勉強会(6) #bje_study

31

@WebService

• クラスをウェブサービスにする。• WDSL ファイルに関するカスタマイズが可能– WSDL の Web サービス名– 名前空間のカスタマイズ– WDSL 自体の場所の変更

• クラスにアノテーションするとコンテナがインタフェースを生成する。

• インタフェースに付加してクラスで実装することもできる。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 32: Beginning Java EE 6 勉強会(6) #bje_study

32

@WebMethod

• デフォルトではクラスのパブリックメソッドがすべて WSDL で公開される。 WSDLへのマッピングをカスタマイズする– マッピングした際のメソッド名の変更– WSDL からメソッドの除外を可能とする

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 33: Beginning Java EE 6 勉強会(6) #bje_study

33

@WebResult 、 @WebParam

• @WebResult– @WebMethod と連携して WSDL でメソッドの戻

り値につけられる名前を制御する。• @WebParam– @WebResult と同様に、メソッドに渡すパラメー

タのカスタマイズが可能となる。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 34: Beginning Java EE 6 勉強会(6) #bje_study

34

@OneWay

• 戻り値がない (void) メソッドに使用する。– 非同期呼び出しなど– 呼び出しを最適化することができる。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 35: Beginning Java EE 6 勉強会(6) #bje_study

35

ライフサイクルとコールバック

• 存在しない状態と準備状態の2種類• @PostConstruct と @PreDestroy

12/06/27 Beginning JavaEE6 勉強会 (6)

存在しない状態

準備状態

@PostConstruct @PreDestroy

メソッド呼び出し

Page 36: Beginning Java EE 6 勉強会(6) #bje_study

36

Web サービスコンテキスト

• Web サービスの環境コンテキストにアクセスできる– エンドポイント実装クラス– メッセージ・コンテキスト– 現在処理中のリクエストに関わるセキュリティ情報

など– @ Resource アノテーションで

WebServiceContext を注入する

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 37: Beginning Java EE 6 勉強会(6) #bje_study

37

WebServiceContext のメソッドメソッド 説明getMessageContext このメソッドが呼び出されたときに

処理中のリクエストのMessageContextを返す。これは、 SOAPメッセージのヘッダーや本文などにアクセスするために使用可能

getUserPrincipal 現在調整中のリクエストの送信元を識別する Principalを返す

isUserInRole 認証済みのユーザーが指定された論理ロールに含まれているかどうかを示す boolean値を返す

getEndpointReference このエンドポイントに関連するEndpointReferenceを返す。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 38: Beginning Java EE 6 勉強会(6) #bje_study

38

演習3 JAX-WS アノテーション

• Ex16 のソースコードと WSDL をのぞいてみましょう!

• アノテーションから WSDL の記述を予想しよう!

• @WebService のはどこについてますか?– クラス or インタフェース

• @WebService を付加する場所を変えてWSDL を確認してみよう。

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 39: Beginning Java EE 6 勉強会(6) #bje_study

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 インタフェース

Page 40: Beginning Java EE 6 勉強会(6) #bje_study

40

プロキシの取得

• アノテーション @WebServiceRef– コンテナ内で実行しない場合は使えない

• wsimport ツールによって生成されるクラスを利用– GlassFish や JDK に同梱されている

12/06/27 Beginning JavaEE6 勉強会 (6)

ローカルクラスと同じように記述するが、 SEI が Web サービスにルーティングしている。

Page 41: Beginning Java EE 6 勉強会(6) #bje_study

41

演習4クライアントを動かす!

• まずはサーバを停止した状態で、クライアントをビルドしよう。なぜビルドが失敗したか?– たぶん本来であれば ex04,ex08 はビルドで

きるはず。• サーバを立ち上げてビルドしよう!– クライアント側の pom ファイルに WSDL を設定

する必要があります。

• それぞれのサンプルの結果を確認してみよう!

12/06/27 Beginning JavaEE6 勉強会 (6)

Page 42: Beginning Java EE 6 勉強会(6) #bje_study

42

まとめ

• SOAP Web サービスの概要– 関連技術– SOAP を使った Web サービスの呼び出し方法

• JAXB– オブジェクトと XML のバインド– スキーマとクラスのバインド

• Web サービスの内部動作• JAX-WS

12/06/27 Beginning JavaEE6 勉強会 (6)