J2EEのInterstage Webサービスでは、アプリケーションはWeb Services for J2EE 1.1およびJAX-RPC 1.1に従います。
Java EE 7のWebサービスでは、アプリケーションはImplementing Enterprise Web Services 1.3およびJAX-WS 2.2に従います。JAX-WSは、JAX-RPCの後継という位置付けですが、JAX-RPCに対する後方互換性はありません。移行には、アプリケーションの変更が必要です。
サーバ機能の作成の流れ
クライアント機能の作成の流れ
J2EEのInterstage Webサービスのアプリケーション(“JAX-RPC仕様”による実装)から、Java EE 7のWebサービスのアプリケーション(“JAX-WS仕様”による実装)への移行方法について説明します。
なお、以降では、“JAX-RPC仕様”を“JAX-RPC”、“JAX-WS仕様”を“JAX-WS”と表記している場合があります。
移行方法としては、WebサービスのアプリケーションおよびWebサービスのクライアントアプリケーションの両方を作り変えることを推奨します。ただし、以下の場合は、WSDLを変更せずに移行する方法で移行してください。
同時にクライアントアプリケーションが作り変えられない場合
移行対象のWebサービスアプリケーションをiswsgen serverコマンドで生成した資材で作成した場合
以下の機能は、Java EE 7のWebサービスでは提供されていません。これらの機能が必要な場合は、J2EEのInterstage Webサービスを使用するか、Document/LiteralまたはRPC/Literal方式のアプリケーションに作り変えてください。
RPC/EncodedのSOAPバインディング方式
Java EE 7のWebサービスのアプリケーションに作り変える
J2EEのInterstage Webサービスのアプリケーションのソースを直接Java EE 7のWebサービスのアプリケーションに作り変える手順を説明します。
本手順で移行したWebサービスは、WSDLを作り直すため、当該Webサービスを利用しているクライアントアプリケーションも同時に移行する必要があります。
Webサービスアプリケーションの移行
Javaのインターフェースを基点に、Java EE 7のWebサービスに移行する手順を説明します。
Webサービスエンドポイントの移行
移行前のWebサービスエンドポイントを、以下のように修正します。
サービスエンドポイントに@javax.jws.WebServiceアノテーションを付加します。
サービスエンドポイントが実装(implements)しているサービスエンドポイントインターフェースの定義を削除します。
例
移行後のサービスエンドポイントのプログラムソース例
package profile.server; import profile.data.*; @javax.jws.WebService
public class ProfileServerImpl /* implements ProfileServer */ { public Person getProfile(String name) { if ("abc".equals(name)) { return new Person("abc", 20); } else if ("def".equals(name)) { return new Person("def", 30); } else { return new Person(); } } }
なお、EJBアプリケーションの場合は、@javax.jws.WebServiceアノテーションに加え@javax.ejb.Statelessアノテーションを付加します。
アノテーションの詳細については、JAX-WS仕様、Implementing Enterprise Web Services仕様、EJB仕様を参照してください。
また、EJBアプリケーション自体の実装についても、EJB3以上の形式のアプリケーションに移行してください。
注意
JAX-WSとJAX-RPCのデータバインディングなどの違いにより、インターフェースの内容の変更が必要な場合があります。
Webサービスアプリケーションのコンパイルとパッケージング
移行後のWebサービスエンドポイントをコンパイルします。Webサービスエンドポイントが直接利用するBeanクラスなどがあれば、それらもコンパイルします。
例
javac -endorseddirs C:\Interstage\F3FMisje7\glassfish\modules\endorsed;C:\Interstage\F3FMisje7\glassfish\lib\endorsed -d WEB-INF\classes profile\data\Person.java profile\server\ProfileServerImpl.java
クラスファイルの格納先は、warにパッケージングするため、WEB-INF\classesとしています。Person.javaは、ProfileServerImpl.javaが直接利用するBeanクラスです。
注意
移行前のサービスエンドポイントインターフェースのプログラムソースは不要となります。コンパイル時には含めないでください。
Webサービスアプリケーションをパッケージングします。
WebアプリケーションまたはEJBアプリケーションのディレクトリ構成でパッケージングしてください。直接利用するクラスなども含めてパッケージングします。
例
War |-WEB-INF |- classes |- profile |- server | |- ProfileServerImpl.class | - |- data |- Person.class - jar cvf ProfileService.war WEB-INF\*
コンパイルとパッケージングの詳細は、「3.1.1 Webサービスアプリケーションの開発」を参照してください。
注意
移行前のJ2EEのInterstage Webサービスで必須であった“<WSDLファイル名>_mapping.xml”は不要となります。また、web.xmlやwebservice.xmlなどのdeployment descriptorファイルも不要です。
サーバアプリケーションの配備
パッケージングしたモジュールは、Interstage Java EE 7管理コンソールまたはasadmin deployコマンドを使用して、Java EE 7のIJServerクラスタに配備します。配備についての詳細は、「3.1.1 Webサービスアプリケーションの開発」の「配備とWSDLの取得・保管」を参照してください。
Java EE 7のWebサービスのクライアントアプリケーションに作り変える
Webサービスクライアントアプリケーションの移行
以下の移行前のプログラムソースを例に、JAX-WSによる実装への移行方法について説明します。
移行前のプログラムソースについては、該当する版の「J2EE ユーザーズガイド(旧版互換)」の「Webサービスを呼び出す場合(クライアント機能)の開発」を参照してください。
Java EE 7のWebサービスのクライアントアプリケーションの開発の詳細については、「3.1.2 Webサービスクライアントアプリケーションの開発」を参照してください。
例
移行前のWebサービスクライアントアプリケーションのプログラムソース例(JAX-RPCによる実装)
package profile.client; import javax.xml.rpc.*; import profile.data.*; import profile.server.*; public class ProfileClient { public static void main(String[] args) { try { ServiceFactory sf = ServiceFactory.newInstance(); ProfileServerService service = (ProfileServerService) sf.loadService(ProfileServerService.class); ProfileServer portStub = service.getProfileServerPort(); Person person = portStub.getProfile("abc"); System.out.println("name = " + person.getName() + ", age = " + person.getAge()); } catch (Exception e) { e.printStackTrace(); } } }
スタブの生成
移行後のWebサービスアプリケーションのWSDLファイルを使用してJAX-WSのスタブを生成します。ijwsimportコマンドを使用します。ijwsimportコマンドでは、パッケージのカスタマイズなども指定できます。詳細は「10.9 ijwsimport」を参照してください。また、-keepオプションを指定し、生成資材一式を取得、保管することを推奨します。
例
ijwsimport -d classes -keep http://localhost/ProfileService/ProfileServerImplService?wsdl
例では、ijwsimportコマンドの-dオプションにより、classesディレクトリにJAX-WSのスタブのクラスファイルが格納されます。-keepオプションにより、生成資材一式を取得します。
注意
JAX-WSとJAX-RPCのデータバインディングなどの違いにより、インターフェースの内容が変更される場合があります。
クライアントアプリケーションの移行
Webサービスクライアントアプリケーションのエンドポイントの取得処理を、@javax.xml.ws.WebServiceRefアノテーションを使用した取得処理に変更します。
例
移行後のWebサービスクライアントアプリケーションのプログラムソース例(JAX-WSによる実装)
package profile.client; import profile.server.*; public class ProfileClient{ @javax.xml.ws.WebServiceRef private static ProfileServerImplService service; public static void main(String[] args) { try{ ProfileServerImpl port = service.getProfileServerImplPort(); Person person = port.getProfile("abc"); System.out.println("name = " + person.getName() + ", age = " + person.getAge()); } catch (Exception e) { e.printStackTrace(); } } }
アノテーションの詳細については、JAX-WS仕様、Implementing Enterprise Web Services仕様を参照してください。
また、JAX-WSとJAX-RPCのデータバインディングなどの違いにより、インターフェースの内容が変更になった場合には、その違いを考慮した呼出し方法に変更してください。
クライアントアプリケーションのコンパイル
移行後のWebサービスクライアントアプリケーションをコンパイルします。
例
javac -endorseddirs C:\Interstage\F3FMisje7\glassfish\modules\endorsed;C:\Interstage\F3FMisje7\glassfish\lib\endorsed -classpath classes -d classes ProfileClient.java
クラスパスにスタブファイルのパスclassesを指定しています。また、クラスファイルの格納先をclassesにしています。
クライアントアプリケーションのパッケージング
JAX-WSを使用して作成されたWebサービスクライアントアプリケーションは、Java EE 7のIJServerクラスタ、またはアプリケーションクライアントコンテナで実行します。実行する環境にあったパッケージングを行ってください。
例
アプリケーションクライアント
|- classes |- profile | |- client | | |- ProfileClient.class | | - | |- server | |- ijwsimportで生成したスタブファイル(.class) | - |- META-INF |- MANIFEST.MF - jar cvfm ProfileClient.jar classes\META-INF\MANIFEST.MF -C classes .
マニフェストファイルMANIFEST.MFには、メインクラスを定義します。
例
Main-Class: profile.client.ProfileClient
クライアントアプリケーションの実行
IJserverクラスタ上で実行する場合は、配備処理を行い、Webアプリケーションとしてアクセスします。アプリケーションクライアントコンテナで実行する場合は、appclientコマンドを使用します。
例
appclient -client ProfileClient.jar
なお、Webサービスクライアントは、実行時に、スタブの生成で実行したijwsimportコマンドで指定したWSDLファイルにアクセスします。WSDLのURLがスタブ生成時と実行時で異なる場合は、deployment descriptorやアノテーションを使用してカスタマイズします。詳細は、「4.11 Webサービスクライアントを利用する場合の手順」を参照してください。
WSDLを変更せずにWebサービスを移行する
J2EEのInterstage Webサービスが公開しているWSDLの内容を変更せずに、J2EEのInterstage WebサービスのアプリケーションをJava EE 7のWebサービスのアプリケーションに移行する手順を説明します。
本手順で移行したWebサービスは、WSDLの変更が伴わないため、当該Webサービスを利用しているクライアントアプリケーションはそのまま運用することができます。
Webサービスアプリケーションの移行
J2EEのInterstage Webサービスで構築された、移行前のWebサービスのWSDLファイルを基点にJava EE 7のWebサービスに移行する手順を説明します。
サービスエンドポイントインターフェースの作成
移行前のJ2EEのInterstage WebサービスのWSDLファイルからJAX-WS用のサービスエンドポイントインターフェースを生成します。ijwsimportコマンドを使用します。ijwsimportコマンドでは、パッケージのカスタマイズなども指定できます。詳細は「10.9 ijwsimport」を参照してください。また、-keepオプションを指定し、生成資材一式を取得し、保管することを推奨します。
例
WSDLファイル:ProfileServerPort.wsdl
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://server.profile" --(1)
xmlns:impl="http://server.profile" xmlns:intf="http://server.profile" xmlns:tns2=http://data.profile xmlns:wsdl=http://schemas.xmlsoap.org/wsdl/ xmlns:wsdlsoap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!--WSDL created by Interstage Web Service version: 1.2 (r6010:6011) Built on Jun 04, 2009 (02:22:19 JST)--> <wsdl:types> ~ 略 ~ </wsdl:types> <wsdl:message name="getProfileRequest"> ~ 略 ~ </wsdl:message> <wsdl:portType name="ProfileServer"> ~ 略 ~ </wsdl:portType> <wsdl:binding name="ProfileServerPortSoapBinding" type="impl:ProfileServer"> ~ 略 ~ </wsdl:binding> <wsdl:service name="ProfileServerService"> --(2)
<wsdl:port binding="impl:ProfileServerPortSoapBinding" name="ProfileServerPort"> --(3) <wsdlsoap:address location="http://dynames-2k3-10/ProfileService/services/ProfileServer"></wsdlsoap:address> </wsdl:port> </wsdl:service> </wsdl:definitions> ijwsimport -d classes -keep ProfileServerPort.wsdl
例では、ijwsimportコマンドの-dオプションにより、classesディレクトリにJAX-WS用のサービスエンドポイントインターフェースのクラスファイルが格納されます。-keepオプションにより、生成資材一式を保持します。
Webサービスエンドポイントの移行
移行前のWebサービスエンドポイントは、以下を修正します。
Webサービスエンドポイントに@javax.jws.WebServiceアノテーションを付加します。アノテーションの各属性に、対応する値を指定します。
属性名 | 指定値 |
---|---|
endpointInterface | ijwsimportで生成されたサービスエンドポイントインターフェースのフルパッケージ名付きクラス名 |
portName | WSDLファイルの<wsdl:port>タグのname属性値 (上記WSDLファイル例の(3)) |
serviceName | WSDLファイルの<wsdl:service>タグのname属性値 (上記WSDLファイル例の(2)) |
targetNamespace | WSDLファイルの<wsdl:definitions>タグのtargetNamespace属性値 (上記WSDLファイル例の(1)) |
wsdlLocation | Webサービスアプリケーションに含めるWSDLファイルの参照位置 |
このとき、endpointInterface属性には、パッケージ名を含めたサービスエンドポイントインターフェース名を指定します。
implementsの定義を削除します。
引数で使用しているクラスは、生成された資材を使用するように変更します。
例
移行後のWebサービスエンドポイントの例
package profile.server; import profile.data.*; @javax.jws.WebService(endpointInterface="profile.server.ProfileServer",
portName="ProfileServerPort",
serviceName="ProfileServerService",
targetNamespace = "http://server.profile",
wsdlLocation="WEB-INF/wsdl/ ProfileServerPort.wsdl")
public class ProfileServerImpl /* implements ProfileServer */ { public Person getProfile(String name) { if ("abc".equals(name)) { /* return new Person("abc", 20); */ Person person = new Person(); person.setName("abc"); person.setAge(20); return person; } else if ("def".equals(name)) { /* return new Person("def", 30); */ Person person = new Person(); person.setName("def"); person.setAge(30); return person;
} else { return new Person(); } } }
なお、EJBアプリケーションの場合は、@javax.jws.WebServiceアノテーションに加え@javax.ejb.Statelessアノテーションを付加します。アノテーションの詳細については、JAX-WS仕様、Implementing Enterprise Web Services仕様、EJB仕様を参照してください。
また、EJBアプリケーション自体の実装についても、EJB3以上の形式のアプリケーションに移行してください。
Webサービスアプリケーションのコンパイル
移行後のWebサービスエンドポイントをコンパイルします。
例
javac -endorseddirs C:\Interstage\F3FMisje7\glassfish\modules\endorsed;C:\Interstage\F3FMisje7\glassfish\lib\endorsed -classpath classes -d WEB-INF\classes ProfileServerImpl.java
クラスパスに生成した資材のファイルのパスを追加で指定します。生成したクラスファイルの格納先は、warにパッケージングするため、WEB-INF\classesとしています。
注意
移行前のサービスエンドポイントインターフェースのプログラムソースは不要となりますので、コンパイル時には含めないでください。
deployment descriptorの作成
Webアプリケーションの場合
移行前と同様のURLでWebサービスがアクセスできるようweb.xmlを作成し、warファイルに含めます。
web.xmlには、以下の情報を記述します。
タグ名 | 指定値 | |
---|---|---|
<web-app> | Servlet3の名前空間 | |
<servlet> | <servlet-name> | WSDLの<wsdl:portType>タグのname属性の値 |
<class-name> | Webサービスエンドポイントクラスのフルパッケージ名付きのクラス名 | |
<servlet-mapping> | <servlet-name> | マッピング定義をするサーブレット名 |
<url-pattern> | WSDLの<wsdlsoap:address>タグのlocation属性のURLのhttp://ホスト名/コンテキストルート名以降のパス |
例
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee"
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"> <servlet> <servlet-name>ProfileServer</servlet-name> <servlet-class>profile.server.ProfileServerImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>ProfileServer</servlet-name> <url-pattern>/services/ProfileServer</url-pattern> </servlet-mapping> </web-app>
EJBアプリケーションの場合
EJBアプリケーション自体の移行については、「13.3.11 EJBアプリケーション」に従って移行してください。
Java EE 7のWebサービスの接続先URLは一定のルールで決まり、移行前のURLを任意に指定することはできません。EJBアプリケーションの場合、移行前と同様のURLでWebサービスにアクセスすることはできません。クライアント側で、接続先URLを指定するようにしてください。Java EE 7のWebサービスのエンドポイントのURLについては、「配備とWSDLの取得・保管」を参照してください。J2EEのInterstage Webサービスクライアントアプリケーションで接続先URLを変更する方法については、「J2EE ユーザーズガイド(旧版互換)」の「Webサービスを呼び出す場合(クライアント機能)の開発」の「HTTP接続に関する設定」を参照してください。
Webサービスアプリケーションのパッケージング
Webサービスアプリケーションをパッケージングします。
WebアプリケーションまたはEJBアプリケーションのディレクトリ構成でパッケージングしてください。ijwsimportで生成された資材、WSDLファイル、web.xmlファイル、および直接利用するクラスなども含めてパッケージングします。
例
War |-WEB-INF |- classes | |- profile | |- server | | |- ProfileServerImpl.class | | |- ijwsimportで生成されたクラスファイル | | | (ProfileServer.class等) | | - | |- data | |- ijwsimportで生成されたクラスファイル(Person.class等) | - |- wsdl | |- ProfileServerPort.wsdl | - |- web.xml jar cvf ProfileService.war WEB-INF\*
注意
移行前のJ2EEのInterstage Webサービスで必須であった“<WSDLファイル名>_mapping.xml”、webservices.xmlは不要です。
EJBアプリケーションの場合、EARファイルにパッケージングしなくても配備できます。
コンパイルおよびパッケージングの詳細については、「3.1.1 Webサービスアプリケーションの開発」を参照してください。
サーバアプリケーションの配備
パッケージングしたモジュールは、Interstage Java EE 7管理コンソールまたはasadmin deployコマンドを使用して、Java EE 7のIJServerクラスタに配備します。配備についての詳細は、「3.1.1 Webサービスアプリケーションの開発」の「配備とWSDLの取得・保管」を参照してください。