Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング 11g リリース1 (10.3.6) B61633-05 |
|
前 |
次 |
この章では、RESTful (Representational State Transfer)なWebサービスを開発する方法について説明します。
この章の内容は以下のとおりです。
RESTとは、Simple Object Access Protocol (SOAP)のように追加のメッセージ層を使用することなく、HTTPなどの標準化されたインタフェースでデータを転送するためのシンプルなインタフェースを記述したものです。RESTは、一意のURIで特定できるステートレス・サービスをリソース(特定の情報のソース)とみなし、これらを作成するための設計ルールのセットを提供します。クライアントはURI、標準化されたメソッドの固定セットを使用してリソースにアクセスし、リソースの表現が戻されます。クライアントは、新しいリソース表現を受け取るたびに転送状態に設定されます。
WebLogic Serverは、RESTfulなWebサービスの開発を実現するために次の方法をサポートしています。
WebLogic Serverに含まれている、Jersey JAX-RS参照実装(RI)の実行に必要な一連の事前構築済共有ライブラリを登録して使用します。次のバージョンを、事前作成共有ライブラリとして使用できます。
JAX-RS RIバージョン1.9
JAX-RS RIバージョン1.1.5.1
必要に応じて、さらに新しいバージョンのJersey JAX-RS RI共有ライブラリを構築してデプロイできます。Jersey JAX-RS RI共有ライブラリの使用の詳細は、「Jersey JAX-RS参照実装の使用」を参照してください。
「XML over HTTPを使用するWebサービスのプログラミング」の説明に従い、標準JAX-WS RIを使用して、HTTPプロトコルを使用するRESTfulを実装します。
注意: Jersey JAX-RS RIは、RESTfulなWebサービスを構築するための、本番環境に対応できるオープン・ソースの参照実装を提供します。標準JAX-WS HTTPプロトコル・メソッドについてベスト・プラクティスとして推奨します。 |
WebLogic Serverには、Webアプリケーションとしてパッケージされ、Jersey JAX-RS RIに基づくアプリケーションの実行に必要な事前に作成された共有ライブラリが含まれています。次のバージョンがサポートされています。
Jersey JAX-RS RIバージョン1.9
Jersey JAX-RS RIバージョン1.1.5.1
次の項では、Jersey JAX-RS RI共有ライブラリとその使用手順、および新しいバージョンのJersey JAX-RS RIの登録方法について説明します。
共有ライブラリは、WL_HOME
/common/deployable-libraries
ディレクトリに格納されています。
表20-1に、Jersey JAX-RS RIバージョン1.9 Webサービスをサポートする事前作成共有ライブラリを示します。
表20-1 Jersey JAX-RS RI 1.9の共有ライブラリ
機能 | 説明 |
---|---|
|
|
JAX-RS API |
|
表20-2に、Jersey JAX-RS RI Version 1.1.5.1 Webサービスをサポートする事前作成共有ライブラリを対応する機能ごとにまとめます。共有ライブラリが必須か省略可能かも示します。
表20-2 Jersey JAX-RS RI 1.1.5.1の共有ライブラリ
機能 | 説明 | 必須/省略可能 |
---|---|---|
Jersey |
|
必須 |
JAX-RS API |
|
必須 |
JSON処理 |
|
省略可能 |
JSON処理 |
|
省略可能 |
JSON処理 |
|
省略可能 |
JSONストリーミング |
|
省略可能 |
ATOM処理 |
|
省略可能 |
また、次の表にWebLogic Serverで使用可能な依存JARを示します。これらは共有ライブラリとして登録する必要はありません。
Jersey JAX-RS RIを使用するには、次の手順を実行します:
Jersey JAX-RS RI共有ライブラリを1つ以上のWebLogic Serverインスタンスに登録します。「WebLogic ServerインスタンスへのJersey JAX-RS RI共有ライブラリの登録」を参照してください。
Jersey JAX-RS RI共有ライブラリを使用するように、RESTfulなWebサービスを含むWebアプリケーションを構成します。「Jersey JAX-RS RIを使用するWebアプリケーションの構成」を参照してください。
JAX-RS Webサービスおよびクライアントを作成します。「JAX-RS Webサービスおよびクライアントの作成」を参照してください。
オプションで、Oracle Web Services Manager (Oracle WSM)ポリシーを使用してJerseyサーブレット・アプリケーションを保護します。Jerseyサーブレット・アプリケーションの保護に関する項を参照してください。
必要に応じて、さらに新しいバージョンのJersey JAX-RS RI共有ライブラリを構築してデプロイできます。「新しいバージョンのJersey JAX-RS RIの登録」を参照してください。
Jersey JAX-RS RIの詳細やRESTfulなWebサービスの開発例は、http://jersey.java.net
を参照してください。
共有Java EEライブラリを1つ以上のWebLogic Serverインスタンスに登録するには、ライブラリをターゲットのサーバーにデプロイして、そのデプロイメントを共有することを指示します。共有Java EEライブラリは、ライブラリを参照するアプリケーションをデプロイするのと同じWebLogic Serverインスタンスにターゲット指定する必要があります。
参照側アプリケーションがデプロイされると、WebLogic Serverは共有ライブラリ・ファイルをそのアプリケーションにマージします。必須ライブラリが登録されていないサーバー・インスタンスに参照側アプリケーションをデプロイしようとすると、参照側アプリケーションのデプロイが失敗します。
アプリケーションで必要な機能および使用するJersey JAX-RS RIのバージョンに基づいて、「Jersey JAX-RS RI共有ライブラリの要約」で定義されている1つ以上のJersey JAX-RS共有ライブラリを次のように登録できます。
Jersey JAX-RS RIのバージョン1.9または1.1.5.1のうち、使用するバージョンを選択します。選択したバージョンによって、それぞれ表20-1または表20-2を参照し、アプリケーションに必要な共有ライブラリを選択します。
共有ライブラリを登録するWebLogic Serverターゲットを決定します。共有ライブラリは、参照側アプリケーションをデプロイするのと同じWebLogic Serverインスタンスに登録する必要があります(後で必要に応じて参照側アプリケーションをデプロイできるように、ドメイン内のすべてのサーバーにライブラリをデプロイしてもかまいません)。
共有ライブラリ・ファイルを手順2で決定したターゲット・サーバーにデプロイし、-library
オプションを使用してデプロイメントをライブラリとして指定することで、共有ライブラリを登録します。
Jersey JAX-RS RIバージョン1.9機能およびJAX-RS APIをサポートする共有ライブラリをデプロイする方法の例を次に示します。
weblogic.Deployer -verbose -noexit -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jersey-bundle-1.9.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library weblogic.Deployer -verbose -noexit -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jsr311-api-1.1.1.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library
JAX-RS RIバージョン1.1.5.1を使用する場合の、Jersey JAX-RS RIの基本機能とJAX-RS APIをサポートする共有ライブラリのデプロイ方法を次の例に示します。
weblogic.Deployer -verbose -noexit -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jersey-bundle-1.1.5.1.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library weblogic.Deployer -verbose -noexit -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jsr311-api-1.1.1.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library
weblogic.Deployerの詳細は、「Oracle WebLogic Serverへのアプリケーションのデプロイ」のweblogic.Deployerコマンドライン・リファレンスに関する項を参照してください。
Jersey共有ライブラリを使用するように、RESTfulなWebサービスを含むWebアプリケーションを構成する必要があります。特に、アプリケーションに関連付けられている次の2つのデプロイメント記述子ファイルを更新する必要があります。
web.xml
: WebリクエストをJerseyサーブレットに委任するように更新します。「WebリクエストをJerseyサーブレットに委任するためのweb.xmlの更新」を参照してください。
weblogic.xml
: アプリケーションで必要な表20-1の共有ライブラリを参照するように更新します。「共有ライブラリを参照するためのweblogic.xmlの更新」を参照してください。
すべてのWebリクエストをJerseyサーブレットcom.sun.jersey.spi.container.servlet.ServletContainer
に委任するように、web.xml
ファイルを更新します。web.xml
ファイルは、アプリケーション・アーカイブのルート・ディレクトリのWEB-INF
ディレクトリにあります。
次に、web.xml
ファイルの更新例を示します。
<web-app> <servlet> <display-name>My Jersey Application</display-name> <servlet-name>MyJerseyApp</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>myPackage.myJerseyApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MyJerseyApp</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
前述の例に示したように、次の要素を定義する必要があります。
<servlet-class>
要素は、Jersey JAX-RS RIへのエントリ・ポイントであるサーブレットを定義します。この値は、常にcom.sun.jersey.spi.container.servlet.ServletContainer
に設定する必要があります。
<init-param>
要素は、アプリケーション・サブクラスで説明しているように、javax.ws.rs.core.Application
を拡張するクラスを定義します。
<servlet-mapping>
要素は、MyJerseyApp
サーブレットにマップされる基本URLパターンを定義します。URLのhttp://<host>:<port>
よりも後の部分に<webAppName>
を付加したものが、WebLogic Serverによって<url-pattern>
と比較されます。パターンが一致すると、この要素にマップされたサーブレットが呼び出されます。
web.xml
デプロイメント記述子の詳細は、Oracle WebLogic ServerのためのWebアプリケーション、サーブレットおよびJSPの開発のweb.xmlデプロイメント記述子の要素に関する項を参照してください。
アプリケーションで必要な共有ライブラリを参照するようにweblogic.xml
ファイルを更新します。weblogic.xml
ファイルは、アプリケーション・アーカイブのルート・ディレクトリのWEB-INF
ディレクトリにあります。
<exact-match>
ディレクティブを使用すると、デプロイされた共有ライブラリの最新バージョンが使用されるかどうかを制御できます。trueに設定すると、新しいバージョンがWebLogic Serverにデプロイされているかどうかに関係なく、weblogic.xml
に指定されたバージョンが使用されます。falseに設定すると、weblogic.xmlファイルでの指定内容にかかわらず、WebLogic Serverにデプロイされている最新バージョンが使用されます。
たとえば、<exact-match>
ディレクティブをfalseに設定し、「新しいバージョンのJersey JAX-RS RIの登録」の説明に従い、より新しいバージョンのJerseyソフトウェアを共有ライブラリとして登録すると、アプリケーションでは新しい方の共有ライブラリが自動的に使用されます。このケースでは、最新バージョンを使用するためにweblogic.xml
ファイルを編集する必要はありません。
次の例は、JAX-RS RIバージョン1.9を使用するためにweblogic.xml
ファイルを更新する方法を示しています。
<library-ref> <library-name>jax-rs</library-name> <specification-version>1.1</specification-version> <implementation-version>1.9</implementation-version> <exact-match>false</exact-match> </library-ref>
次の例は、JAX-RS RIバージョン1.1.5.1を使用するためにweblogic.xml
ファイルを更新する方法を示しています。すべての共有ライブラリ参照は、すべてのWebアプリケーションに必要なわけではありません。ただし、jersey-bundleおよびjsr311共有ライブラリは共にJersey JAX-RS RIを使用する必要があります。この例では、<exact-match>
はfalseに設定され、WebLogic Serverにデプロイされた共有ライブラリの最新バージョンが使用されるように指定します。
<library-ref> <library-name>jersey-bundle</library-name> <specification-version>1.1.1</specification-version> <implementation-version>1.1.5.1</implementation-version> <exact-match>false</exact-match> </library-ref> <library-ref> <library-name>jsr311</library-name> <specification-version>1.1.1</specification-version> <implementation-version>1.1.1</implementation-version> <exact-match>false</exact-match> </library-ref> <library-ref> <library-name>jackson-core-asl</library-name> <specification-version>1.0</specification-version> <implementation-version>1.1.1</implementation-version> <exact-match>false</exact-match> </library-ref> <library-ref> <library-name>jettison</library-name> <specification-version>1.1</specification-version> <implementation-version>1.1</implementation-version> <exact-match>false</exact-match> </library-ref> <library-ref> <library-name>rome</library-name> <specification-version>1.0</specification-version> <implementation-version>1.0</implementation-version> <exact-match>false</exact-match> </library-ref>
weblogic.xml
デプロイメント記述子の詳細は、Oracle WebLogic ServerのためのWebアプリケーション、サーブレットおよびJSPの開発のweblogic.xmlデプロイメント記述子の要素に関する項を参照してください。
Jersey JAX-RS RIを登録し、Webアプリケーションを構成してから、デプロイメントに必要なJAX-RS Webサービスおよびクライアント、そしてアプリケーション・サブクラスを作成できます。次に、単純なWebサービスとクライアントを示します。
次に、RESTfulなWebサービスの非常に単純な例を示します。
package samples.helloworld; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; // Specifies the path to the RESTful service @Path("/helloworld") public class helloWorld { // Specifies that the method processes HTTP GET requests @GET @Path("sayHello") @Produces("text/plain") public String sayHello() { return "Hello World!"; } }
次に、事前に定義されたRESTful Webサービスを呼び出す簡単なRESTfulクライアントを示します。このサンプルでは、Jersey JAX-RS RIによって具体的に提供されるクラスを使用します。このクラスはJAX-RS規格の一部ではありません。
package samples.helloworld.client; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; public class helloWorldClient { public helloWorldClient() { super(); } public static void main(String[] args) { Client c = Client.create(); WebResource resource = c.resource("http://localhost:7101/RESTfulService-Project1-context-root/jersey/helloWorld"); String response = resource.get(String.class); } }
次の例では、RESTful Webサービスのアプリケーション・デプロイメントのコンポーネントを定義するためにjavax.ws.rs.core.Application
を拡張し、追加のメタデータを提供するクラスの作成方法を説明します。javax.ws.rs.core.Application
の詳細は、Javadoc(http://download.oracle.com/javaee/5/api/javax/ws/rs/core/Application.html
)を参照してください。
Application
サブクラス内で、必要に応じて、getClasses()
およびgetSingletons()
メソッドをオーバーライドし、RESTful Webサービス・リソースのリストを戻します。リソースはそれを戻すApplication
サブクラスにバインドされます。
両方のメソッドが同じリソースを戻す場合、エラーが戻されることに注意してください。
javax.ws.rs.ApplicationPath
アノテーションを使用して、サーブレットにマップされる基底URIパターンを定義します。@ApplicationPath
アノテーションの詳細は、Javadoc(http://download.oracle.com/javaee/5/api/javax/ws/rs/ApplicationPath.html
)を参照してください。
javax.ws.rs.core.Application
を拡張し、@ApplicationPath
アノテーションを使用してリソースの基底URIを定義するクラスの例を次に示します。
import javax.ws.rs.core.Application; javax.ws.rs.ApplicationPath; ... @ApplicationPath("resources") public class MyApplication extends Application { public Set<java.lang.Class<?>> getClasses() { Set<java.lang.Class<?>> s = new HashSet<Class<?>>(); s.add(HelloWorldResource.class); return s; } }
Jerseyサーブレット・アプリケーションを保護するために、次のOracle WSMポリシーのうちの1つ以上をアタッチできます。これらのポリシーに関する詳細情報およびポリシーを手動で構成する方法は、『Webサービスのためのセキュリティおよび管理者ガイド』の事前定義済ポリシーに関する項を参照してください。
注意:
|
認証ポリシー
oracle/wss_http_token_service_policy
oracle/http_basic_auth_over_ssl_service_policy
oracle/http_oam_token_service_policy
oracle/http_saml20_token_bearer_service_policy
oracle/http_saml20_token_bearer_over_ssl_service_policy
oracle/multi_token_rest_service_policy
(1つのみのポリシー)
oracle/multi_token_over_ssl_rest_service_policy
(1つのみのポリシー)
認可ポリシー
oracle/binding_authorization_denyall_policy
oracle/binding_authorization_permitall_policy
oracle/binding_permission_authorization_policy
OWSMポリシーを使用してJerseyサーブレット・アプリケーションを保護するには、web.xml
ファイルを更新します。詳細手順は、『Webサービスのためのセキュリティおよび管理者ガイド』のサーブレット・アプリケーションへのポリシーのアタッチに関する項を参照してください。
次に、web.xml
ファイルの更新例を示します。
例20-1 ポリシーをJerseyサーブレット・アプリケーションにアタッチするために更新するweb.xmlファイルの例
<?xml version = '1.0' encoding = 'windows-1252'?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <filter> <filter-name>OWSM Security Filter</filter-name> <filter-class>oracle.wsm.agent.handler.servlet.SecurityFilter</filter-class> <init-param> <param-name>servlet-name</param-name> <param-value>MyJerseyApp</param-value> </init-param> <init-param> <param-name>oracle.wsm.metadata.policySet</param-name> <param-value><![CDATA[<sca11:policySet name="policySet" appliesTo="REST-Resource()" attachTo="Service('*')" xmlns:sca11="http://docs.oasis-open.org/ns/opencsa/sca/200903" xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy" xmlns:wsp15="http://www.w3.org/ns/ws-policy"> <wsp15:PolicyReference URI="oracle/multi_token_rest_service_policy" orawsp:category="security" orawsp:status="enabled"> </wsp15:PolicyReference> <wsp15:PolicyReference URI="oracle/binding_authorization_permitall_policy" orawsp:category="security" orawsp:status="enabled"> </wsp15:PolicyReference> </sca11:policySet>]]> </param-value> </init-param> </filter> <filter-mapping> <filter-name>OWSM Security Filter</filter-name> <servlet-name>MyJerseyApp</servlet-name> </filter-mapping> <servlet> <display-name>My Jersey Application</display-name> <servlet-name>MyJerseyApp</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>myPackage.myJerseyApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MyJerseyApp</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
WebLogic Serverで提供されるバージョンよりも新しいJersey JAX-RS RI共有ライブラリを使用する場合、次の手順を実行する必要があります。
関連するJersey JARファイルの必要なバージョンをJersey Webサイト(http://jersey.java.net
)からダウンロードします。
手順1でダウンロードしたJARファイルを拡張し、Oracle WebLogic Serverのためのアプリケーションの開発の共有Java EEライブラリの作成に関する項の手順を実行して、新しい共有ライブラリを作成します。
共有ライブラリ・ファイルを手順2で決定したターゲット・サーバーにデプロイし、-library
オプションを使用してデプロイメントをライブラリとして指定することで、共有ライブラリを登録します。次の手順を実行する必要があります。
-name
引数に、表20-2に定義されている標準Jersey JAX-RS RI共有ライブラリ名を設定します。たとえば、jersey-bundle
と設定します。
異なる共有ライブラリのバージョンを区別するために、-libSpecVer
引数と-libImplVer
引数を設定します。
最新バージョンのJersey JAX-RS RI機能をデプロイする方法の例を次に示します。weblogic.Deployerの詳細は、「Oracle WebLogic Serverへのアプリケーションのデプロイ」のweblogic.Deployerコマンドライン・リファレンスに関する項を参照してください。
weblogic.Deployer -verbose -noexit -name jersey-bundle -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jersey-bundle-1.2.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library -libspecver 1.2 -libimplver 1.2
Webアプリケーションを再構成する必要があるかどうかを判別します。
「Jersey JAX-RS RIを使用するWebアプリケーションの構成」の説明に従って、Webアプリケーションを構成するときにweblogic.xml
ファイルで<exact-match>
ディレクティブをfalseに設定すると、最新の指定バージョンの共有ライブラリが使用され、Webアプリケーションの構成を更新する必要はありません。
<exact-match>
ディレクティブをtrueに設定する場合、つまり最新バージョンではないJersey JAX-RS RIを使用したい場合は、該当する共有ライブラリを参照するようにweblogic.xml
を更新する必要があります。詳細は、「Jersey JAX-RS RIを使用するWebアプリケーションの構成」を参照してください。
新たに登録したバージョンのJersey JAX-RS共有ライブラリを使用する必要があるアプリケーションを再デプロイします。
注意: 「Jersey JAX-RS参照実装の使用」で説明されているように、ベスト・プラクティスとしてJersey JAX-RS RI共有ライブラリ・ソリューションの使用をお薦めします。Jersey JAX-RS RIでは、RESTfulなWebサービスを構築するために本番環境として使用できるオープン・ソースのRIが提供され、すべてのHTTPメソッドがサポートされます。 |
HTTPプロトコルを使用してWebサービス・リソースにアクセスする場合、リソース識別子はリソースのURLであり、このリソースで実行される標準の操作はHTTPの1つのメソッド(GET、PUT、DELETE、POST、またはHEAD)です。
注意: このJAX-WS実行で、サポートされたHTTPメソッドのセットがGETおよびPOSTに限定されています。DELETE、PUTおよびHEADがサポートされません。これらのメソッドを含むどのHTTPリクエストも PUTおよびDELETEの機能が必須の場合、POSTメソッドで実行される実際のメソッドをトンネリングすることによって目的のアクションを実行できます。これは、オーバーロードPOSTと呼ばれる回避策です。「REST過負荷POST」でのWeb検索は、これを実行するためのいくつかの方法を返します。 |
javax.xml.ws.Provider<T>
インタフェースのinvoke()
メソッドを使用してRESTfulに類似したエンドポイントを構築します(http://download.oracle.com/javaee/5/api/javax/xml/ws/Provider.html
を参照)。Provider
インタフェースは、サービス・エンドポイント・インタフェース(SEI)を構築するための動的な代替手段を提供します。
この項の手順では、XML over HTTPを使用してWebサービスを実装するために必要なJWSファイルをプログラミングおよびコンパイルする方法について説明します。この手順では、これらのJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。
Antベースの開発環境を設定済であり、かつjwsc
Antタスクを実行してWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xml
ファイルがあることが前提となっています。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。
表20-4 RESTfulなWebサービスのプログラミング手順
# |
手順 | 説明 |
---|---|---|
1 |
XML over HTTPを使用するWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。 |
使い慣れたIDEまたはテキスト・エディタを使用します。「XML over HTTPを使用するWebサービスのプログラミングのガイドライン」を参照してください。 |
2 |
|
例: <jwsc srcdir="." destdir="output/restEar"> <jws file="NearbyCity.java" type="JAXWS"/> </jwsc> 詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。 |
3 |
Antターゲットを実行して、Webサービスを構築します。 |
例: prompt> ant build-rest |
4 |
Webサービスを通常どおりデプロイします。 |
『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。 |
5 |
Webサービス・クライアントからWebサービスにアクセスします。 |
「クライアントからWebサービスにアクセスする」を参照してください。 |
次のサンプルでは、XML over HTTPを使用するWebサービスを実装する簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。
package examples.webservices.jaxws.rest; import javax.xml.ws.WebServiceProvider; import javax.xml.ws.BindingType; import javax.xml.ws.Provider; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.http.HTTPBinding; import javax.xml.ws.http.HTTPException; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.util.StringTokenizer; @WebServiceProvider( targetNamespace="http://example.org", serviceName = "NearbyCityService") @BindingType(value = HTTPBinding.HTTP_BINDING) public class NearbyCity implements Provider<Source> { @Resource(type=Object.class) protected WebServiceContext wsContext; public Source invoke(Source source) { try { MessageContext messageContext = wsContext.getMessageContext(); // Obtain the HTTP mehtod of the input request. javax.servlet.http.HttpServletRequest servletRequest = (javax.servlet.http.HttpServletRequest)messageContext.get( MessageContext.SERVLET_REQUEST); String httpMethod = servletRequest.getMethod(); if (httpMethod.equalsIgnoreCase("GET")); { String query = (String)messageContext.get(MessageContext.QUERY_STRING); if (query != null && query.contains("lat=") && query.contains("long=")) { return createSource(query); } else { System.err.println("Query String = "+query); throw new HTTPException(404); } } catch(Exception e) { e.printStackTrace(); throw new HTTPException(500); } } } else { // This operation only supports "GET" throw new HTTPException405); } private Source createSource(String str) throws Exception { StringTokenizer st = new StringTokenizer(str, "=&/"); String latLong = st.nextToken(); double latitude = Double.parseDouble(st.nextToken()); latLong = st.nextToken(); double longitude = Double.parseDouble(st.nextToken()); City nearby = City.findNearBy(latitude, longitude); String body = nearby.toXML(); return new StreamSource(new ByteArrayInputStream(body.getBytes())); } static class City { String city; String state; double latitude; double longitude; City(String city, double lati, double longi, String st) { this.city = city; this.state = st; this.latitude = lati; this.longitude = longi; } double distance(double lati, double longi) { return Math.sqrt((lati-this.latitude)*(lati-this.latitude) + (longi-this.longitude)*(longi-this.longitude)) ; } static final City[] cities = { new City("San Francisco",37.7749295,-122.4194155,"CA"), new City("Columbus",39.9611755,-82.9987942,"OH"), new City("Indianapolis",39.7683765,-86.1580423,"IN"), new City("Jacksonville",30.3321838,-81.655651,"FL"), new City("San Jose",37.3393857,-121.8949555,"CA"), new City("Detroit",42.331427,-83.0457538,"MI"), new City("Dallas",32.7830556,-96.8066667,"TX"), new City("San Diego",32.7153292,-117.1572551,"CA"), new City("San Antonio",29.4241219,-98.4936282,"TX"), new City("Phoenix",33.4483771,-112.0740373,"AZ"), new City("Philadelphia",39.952335,-75.163789,"PA"), new City("Houston",29.7632836,-95.3632715,"TX"), new City("Chicago",41.850033,-87.6500523,"IL"), new City("Los Angeles",34.0522342,-118.2436849,"CA"), new City("New York",40.7142691,-74.0059729,"NY")}; static City findNearBy(double lati, double longi) { int n = 0; for (int i = 1; i < cities.length; i++) { if (cities[i].distance(lati, longi) < cities[n].distance(lati, longi)) { n = i; } } return cities[n]; } public String toXML() { return "<ns:NearbyCity xmlns:ns=\"http://example.org\"><City>" +this.city+"</City><State>"+ this.state+"</State><Lat>" +this.latitude + "</Lat><Lng>"+this.longitude+"</Lng></ns:NearbyCity>"; } } }
XML over HTTPを使用するWebサービスを実装するJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。
プロバイダWebサービスを実装するために必要なパッケージをインポートします。
import javax.xml.ws.WebServiceProvider; import javax.xml.ws.BindingType; import javax.xml.ws.Provider;
Provider
実装クラスにアノテーションを追加し、HTTPに対するバインディング・タイプを設定します。
@WebServiceProvider( targetNamespace="http://example.org", serviceName = "NearbyCityService") @BindingType(value = HTTPBinding.HTTP_BINDING)
Provider
インタフェースのinvoke()
メソッドを実装します。
public class NearbyCity implements Provider<Source> { @Resource(type=Object.class) protected WebServiceContext wsContext; public Source invoke(Source source) { ... }
処理のためQUERY_STRING
のフィールドで、処理するのにjavax.xml.ws.handler.MessageContext
でQUERY_STRINGフィールドを使用したリクエスト文字列を取得します(メッセージURL http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.html
を参照してください)。その後、問合せ文字列がcreateSource()
メソッドに渡され、指定した値に最も近い市、州、緯度、経度が返されます。
String query = (String)messageContext.get(MessageContext.QUERY_STRING); . . . return createSource(query);
Webサービス・クライアントからWebサービスにアクセスするには、リソースのURIを使用します。例:
URL url = new URL (http://localhost:7001/NearbyCity/NearbyCityService?lat=35&long=-120); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("POST"); // Get result InputStream is = connection.getInputStream();
この例では、緯度(lat
)と経度(long
)の値を指定して、必要なリソースにアクセスしています。
Webアプリケーションの保護に使用するメソッドと同じメソッドを使用して、XML over HTTPを使用するWebサービスを保護することができます。詳細は、Oracle WebLogic Serverロールおよびポリシーによるリソースの保護のWebアプリケーションおよびEJBリソースの保護のオプションに関する項を参照してください。