ページの先頭行へ戻る
Interstage Application Server V12.0.0 Java EE 7 設計・構築・運用ガイド
FUJITSU Software

13.2.10 Webサービスのアプリケーションについて

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に対する後方互換性はありません。移行には、アプリケーションの変更が必要です。

サーバ機能の作成の流れ

クライアント機能の作成の流れ

13.2.10.1 アプリケーションのJava EE 7のWebサービスへの移行方法

J2EEのInterstage Webサービスのアプリケーション(“JAX-RPC仕様”による実装)から、Java EE 7のWebサービスのアプリケーション(“JAX-WS仕様”による実装)への移行方法について説明します。

なお、以降では、“JAX-RPC仕様”を“JAX-RPC”、“JAX-WS仕様”を“JAX-WS”と表記している場合があります。

移行方法としては、WebサービスのアプリケーションおよびWebサービスのクライアントアプリケーションの両方を作り変えることを推奨します。ただし、以下の場合は、WSDLを変更せずに移行する方法で移行してください。

以下の機能は、Java EE 7のWebサービスでは提供されていません。これらの機能が必要な場合は、J2EEのInterstage Webサービスを使用するか、Document/LiteralまたはRPC/Literal方式のアプリケーションに作り変えてください。

Java EE 7のWebサービスのアプリケーションに作り変える

J2EEのInterstage Webサービスのアプリケーションのソースを直接Java EE 7のWebサービスのアプリケーションに作り変える手順を説明します。

本手順で移行したWebサービスは、WSDLを作り直すため、当該Webサービスを利用しているクライアントアプリケーションも同時に移行する必要があります。


Webサービスアプリケーションの移行

Javaのインターフェースを基点に、Java EE 7のWebサービスに移行する手順を説明します。


  1. 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のデータバインディングなどの違いにより、インターフェースの内容の変更が必要な場合があります。


  2. 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ファイルも不要です。


  3. サーバアプリケーションの配備

    パッケージングしたモジュールは、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();
        }
    }
}
  1. スタブの生成

    移行後の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のデータバインディングなどの違いにより、インターフェースの内容が変更される場合があります。


  2. クライアントアプリケーションの移行

    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のデータバインディングなどの違いにより、インターフェースの内容が変更になった場合には、その違いを考慮した呼出し方法に変更してください。


  3. クライアントアプリケーションのコンパイル

    移行後のWebサービスクライアントアプリケーションをコンパイルします。

    javac -endorseddirs C:\Interstage\F3FMisje7\glassfish\modules\endorsed;C:\Interstage\F3FMisje7\glassfish\lib\endorsed -classpath classes -d classes ProfileClient.java

    クラスパスにスタブファイルのパスclassesを指定しています。また、クラスファイルの格納先をclassesにしています。


  4. クライアントアプリケーションのパッケージング

    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


  5. クライアントアプリケーションの実行

    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サービスに移行する手順を説明します。

  1. サービスエンドポイントインターフェースの作成

    移行前の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オプションにより、生成資材一式を保持します。


  2. 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以上の形式のアプリケーションに移行してください。


  3. 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としています。

    注意

    移行前のサービスエンドポイントインターフェースのプログラムソースは不要となりますので、コンパイル時には含めないでください。

  4. 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接続に関する設定」を参照してください。


  5. 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サービスアプリケーションの開発」を参照してください。


  6. サーバアプリケーションの配備

    パッケージングしたモジュールは、Interstage Java EE 7管理コンソールまたはasadmin deployコマンドを使用して、Java EE 7のIJServerクラスタに配備します。配備についての詳細は、「3.1.1 Webサービスアプリケーションの開発」の「配備とWSDLの取得・保管」を参照してください。