J2EE コンポーネントからの Web サービスへのアクセス: デザインの詳細

ここでは、複数の異なるアプリケーションの Web サービスにアクセスする必要がある J2EE コンポーネントを持つサンプルアプリケーションを検討します。この対処法の具体例として、java.net 主催の bpcatalog プロジェクトにドキュメント指向のアプリケーションが用意されています。このエントリには、異なる対処法で XML ドキュメントに渡すコードの具体例となるいくつかの Web サービスアプリケーションがあり、それぞれのアプリケーションに、注文書を受け付けるサービスエンドポイントが 1 つあります。これらのエンドポイントは、それぞれ異なるインタフェースおよびエンドポイント実装を使って注文書を処理するようにデザインされています。この例では、配備されたサービスにアクセスするクライアントアプリケーションのデザインに焦点を当てます。

クライアントアプリケーションの内容、そしてそのアプリケーションが、スキーマ定義型として XML ドキュメントを使用するようにデザインされている Web サービスエンドポイントにアクセスする方法を見てみましょう。この例では、サーブレットなどの J2EE Web コンポーネントを持つ Web アプリケーションがほかのアプリケーションの Web サービスにアクセスする方法を示します。

このアプリケーションは、3 つの主要エンティティーで構成されています。

この UML 図は、クライアントアプリケーションの基本構造を示しています。

J2EE Client

フロントコントローラ

クライアントでは、ユーザーは、XML ドキュメントを渡す方法が異なるさまざまな Web サービスから、使用するサービスを選択することができます。クライアントは、注文書のフォームにユーザーが入力を行うことを可能にして、そのフォームを送信する一群の JSP ページです。このクライアントのあらゆる要求は、要求の流れを制御する集中フロントコントローラを通ります。フロントコントローラは要求ハンドラを呼び出します。コード例 1 は、要求ハンドラを呼び出し、要求の処理中にエラーが発生した場合にその要求をエラーページに転送するフロントコントローラを示しています。

     resp.setContentType("text/html");
        String responseURL = null;
        String fullURL = req.getRequestURI();
        // スクリーン名を取得
        String selectedURL = null;
        int lastPathSeparator = fullURL.lastIndexOf("/") + 1;
        if (lastPathSeparator != -1) {        
            selectedURL = fullURL.substring(lastPathSeparator, fullURL.length());
        }
        responseURL = getResponseURL(selectedURL);   

        if (selectedURL.equals("invokeservice.do")) {
            try {
                handler.handle(req,resp);

            } catch (RequestHandlerException re) {
                req.setAttribute("error_message", re.getMessage());
                responseURL = getResponseURL("error.do");
            }
        }
        getServletConfig().getServletContext()
                .getRequestDispatcher(responseURL).forward(req, resp);

コード例 1: FrontController.java からの抜粋

要求ハンドラ

要求ハンドラは受信した要求を処理し、Web サービスエンドポイントにアクセスするために適切なビジネス委譲を呼び出します。このハンドラはまた、適切な応答を提供します。クライアントの JSP ページで利用できるよう要求に属性を設定することによって応答メッセージを設定します。ユーザーが修正を行い、エラーから回復できる状況では、RequestHandlerException をスローします。コード例 2 では、適切なビジネス委譲を呼び出して、要求を処理する要求ハンドラを示しています。要求ハンドラは、要求パラメータから注文書オブジェクトを作成します。   
          if(request.getParameter("type").equals("String")){
                ret = stringPOService.submitPO(po);
            } else if(request.getParameter("type").equals("Object")){
                ret = schemaPOService.submitPO(po);
            } else if(request.getParameter("type").equals("AnyType")){
                ret = anyTypePOService.submitPO(po);
            } else if(request.getParameter("type").equals("Any")){
                ret = anyPOService.submitPO(po);
            } else if(request.getParameter("type").equals("Attachment")){
                ret = attachmentPOService.submitPO(po);
            }           
            request.setAttribute("result", ret);   

コード例 2: RequestHandler.java からの抜粋

ビジネス委譲

ビジネス委譲は、ドキュメントをスキーマ定義型として受け付けるエンドポイントに JAX-RPC 呼び出しを行います。コード例 3 は、Web サービスエンドポイントを呼び出すビジネス委譲を示しています。SchemaPOServiceBD が、Web サービスのサポートのためのサービスロケータの更新というカタログエントリで説明しているサービスロケータパターンを使用していることに注意してください。

  SchemaDefinedPurchaseOrderServiceSEI port = (SchemaDefinedPurchaseOrderServiceSEI)         
   serviceLocator.getServicePort(JNDINames.SCHEMA_SERVICE_REF, SchemaDefinedPurchaseOrderServiceSEI.class);
  ...
  String ret = port.submitPO(order);
コード例 3: SchemaPOServiceBD.java からの抜粋

配備記述子

クライアントは、その web.xml ファイルにサービス参照を指定する必要があります。以下は、web.xml からの抜粋です。

<service-ref>
    <description>Schema defined Purchase Order Service Client</description>
    <service-ref-name>service/SchemaDefinedPurchaseOrderService</service-ref-name>
    <service-interface>
        com.sun.j2ee.blueprints.docoriented.client.objectposervice.SchemaDefinedPurchaseOrderService
    </service-interface>
    <wsdl-file>WEB-INF/wsdl/SchemaDefinedPurchaseOrderService.wsdl</wsdl-file>
    <jaxrpc-mapping-file>WEB-INF/schemadefinedpurchaseorderservice-mapping.xml</jaxrpc-mapping-file>
    <service-qname      
      xmlns:servicens="urn:SchemaDefinedPurchaseOrderService">servicens:SchemaDefinedPurchaseOrderService
    </service-qname>
</service-ref>
コード例 4: web.xml から抜粋

クライアントアプリケーションがアクセスする Web サービスアプリケーション

上記のクライアントアプリケーションがアクセスできる Web サービスアプリケーションは 5 つあります。アプリケーションにはそれぞれ、サービスインタフェース 1 つと、注文書 XML ドキュメントを受信するサービスエンドポイント 1 つがあります。これらのアプリケーションは、XML ドキュメントを渡す方法が異なることを除けば、どれも似ています。これらのアプリケーションについては、カタログエントリの該当する項目でそれぞれ詳しく取り上げています。

これらのサービスアプリケーションはともに配備され、そのインタフェースは、次の表に示す関係する WSDL ファイルで見ることができます。

文字列型のドキュメント
StringPurchaseOrderService の WSDL
スキーマ定義型のドキュメント
SchemaDefinedPurchaseOrderService の WSDL
xsd:anyType 型のドキュメント
AnyTypePurchaseOrderService のサービス
xsd:any 型のドキュメント
AnyPurchaseOrderService の WSDL
アタッチメントとしてのドキュメント
AttachmentPurchaseOrderService の WSDL


© Sun Microsystems 2005. All of the material in The Java BluePrints Solutions Catalog is copyright-protected and may not be published in other works without express written permission from Sun Microsystems.