ステップ 6: マッピング用のスクリプトを追加する

Investigate Web サービスでは、クライアントに Applicant オブジェクトを返します。クライアントが独自の Applicant クラスを持っている場合、これで問題ありません。データが SOAP メッセージとして返されたときに、クライアントのソフトウェアによって、独自のコードで使用できる Applicant オブジェクトにメッセージが変換されるからです。しかし、それ以外のクライアントの場合は、どのように対応すればよいのでしょうか。このステップでは、XML マップを Investigate のコールバックに追加して、Applicant オブジェクトを他のクライアントでも理解できる通常の XML に変換します。ここでのクライアントは Applicant クラスを持たず、特定の方法で XML を受信するよう想定しています。XML マップを使用することにより、クライアントが受信する XML メッセージを成形できます。

前のステップの JMS コントロールでも述べたように、XML マップと XML ドキュメントは似ています。WebLogic Server では、作成された XML マップを使用して Java から XML または XML から Java への変換を行います。マップでの変換は、Java の値を XML 要素および属性値として挿入する場所を示すことで行われます(受信 XML メッセージの場合は、その逆の変換が行われます)。置換の方向は、Web サービスで XML メッセージを送信するか受信するかによって異なります。

ここでは、XML マップを適用して、Applicant オブジェクトのデータを特定の XML 形式に変換します。 There's a twist in this case, though: The XML shape expected by the client includes an additional element.この要素では、申込者のクレジット スコアの国内ランクを百分位数で示します。しかし、対象のクライアントだけのために、Java コードに戻って更新作業を行うのは少し面倒です。マップを使用すると、このような面倒な作業を行わずに百分位数のランクを計算することができます。

これを行うには、ECMAScript(JavaScript とも呼ばれる)で関数を記述して、XML マップから関数を参照するようにします。これにより、XML マップに挿入できる、XML でラップされた百分位数のランクが返されます。この作業は、想像するほど難しい作業ではありません。WebLogic Workshop では、ECMAScript の拡張バージョンをサポートしています。この拡張バージョンは、XML ノードおよびノード リストをネイティブ スクリプト オブジェクトに変換します。また、このオブジェクトでは XML での使用に特化した関数を公開します。

このステップでのタスクは次のとおりです。

マッピングで使用するスクリプト ファイルを追加するには

  1. デザイン ビューを表示していない場合は、[デザイン ビュー] タブをクリックします。

  2. financialservices フォルダを右クリックして、[新しいファイル] を選択します。[新しいファイルの作成] ダイアログが表示されます。

  1. 以下の図に示すとおりに値を入力します。

  1. [OK] をクリックします。[OK] をクリックすると、CreditScript.jsx という名前の JSX ファイルが追加されます。以下で説明するように、拡張子 JSX が付いたファイルには特別な意味があります。ソース ビューに新しいファイルが表示されます。

注意 : 新しいファイルには、入門者向けのコメントおよびサンプル コードが記述されています。JSX ファイルでは、特定の形式の関数を使用したマッピングをサポートしています。関数では、XML から Java、または Java から XML へのどちらの変換も行います。

結果はクライアントにマップするので、必要な関数は、Java から XML に変換する関数のみです。ドキュメント コメントだけでなく、作業に関係のない他の関数宣言も削除すると、作業が簡単になります。

  1. 次に示すコードだけが残るようファイルを編集します。

// import mypackage.MyOuterClass.MyClass; /* Rename the "toXML" function given you by WebLogic Workshop, but keep the toXML suffix. This is required in order for WebLogic Server to know that this function is for translating from Java to XML. A "fromXML" function would be for translation in the other direction. */ function calcScoreInfoToXML(obj) { }

Java タイプを XML にマップするスクリプトを記述するには

次に、クライアントで想定される XML 形式を生成するスクリプトを記述します。目的の形式に対応した XML の例を以下に示します。このスクリプトでは、<score_info> 要素内の部分が生成されます。太字の部分は、XML マップから挿入されたものです。

<applicant id="111111111">    
   <name_last>Walton</name_last>
   <name_first>Bill</name_first>
   <bankrupt>true</bankrupt>
   <balance_remaining>1000</balance_remaining>
   <risk_estimate>Ha! Who are they trying to kid?</risk_estimate>
   <score_info>
      
<credit_score>460</credit_score>
      <us_percentile>19.0</us_percentile>
   </score_info>
</applicant>
<notes>Credit score received.</notes>
  1. ファイルの先頭にあるサンプルの import 文を次の文に置き換えます。

import financialservices.Investigate.Applicant;

この文により Applicant クラスがインポートされ、スクリプトで Applicant クラスにアクセスできるようになります。

注意 : このサンプルでの import ディレクティブは、Java のものではなく拡張 ECMAScript の一部です。

  1. 関数のコードを次のように編集します。

import financialservices.Investigate.Applicant; /* The applicantJava parameter represents the Applicant object * passed from the onCreditReportDone callback through its XML map. */ function calcScoreInfoToXML(applicantJava) {        /* Confirm that the applicantJava object passed into the function isn't null.     * If it is, trying to assign values from it will cause a script error.     * If it's null, your script will simply return two empty nodes to add to the     * message created by the XML map.     *     * In the scoreInfoNode variable assignment below, notice too that the two     * new nodes are enclosed in empty elements. These are known as "anonymous"     * elements. They are an ECMAScript extension that enables you to create lists     * of elements such as the two-member list below. Without them, the two elements     * alone would be malformed XML because it lacks a root element.     *     * Simply initializing the variable with a value that begins with < automatically     * makes the scoreInfoNode variable an XML object.     */    if(applicantJava == null) {        var scoreInfoNode = <>                                <credit_score/>                                <us_percentile/>                            </>;    }    /* If the applicantJava value isn't null, use {} to insert a value from it     * into the <credit_score> element. Also, use a function defined in the script     * to calculate the credit score's national percentile ranking.     */    else {        var scoreInfoNode = <>                                <credit_score>{applicantJava.creditScore}</credit_score>                                <us_percentile>{calcPercentile(applicantJava.creditScore)}</us_percentile>                            </>;    }    /* Return the completed XML. */    return scoreInfoNode; } /* A function to figure out the applicant's credit score percentile. */ function calcPercentile (score) {    var percentile = 0;    var scoreLowEnd = 300;    var number = 3162.5;    percentile = Math.ceil((Math.pow(score, 2) - Math.pow(scoreLowEnd, 2))/(2 * number));    return percentile; }

  1. WebLogic Workshop の右上隅の 次のような [閉じる] ボタンをクリックして、Investigate Web サービスのデザイン ビューに戻ります。

注意 : CreditScript.jsx ファイルを閉じても Investigate サービスが表示されない場合は、プロジェクト ツリーで Investigate.jws をダブルクリックします。

  1. onCreditReportDone コールバックに対応する矢印をダブルクリックします。[マップおよびインタフェースの編集] ダイアログが表示されます。

  2. [パラメータ XML] タブで XML マップの記述が次のようになるよう最上部のペインを編集します。

<onCreditReportDone xmlns="http://www.openuri.org/">
    <applicant id="{currentApplicant.taxID}">
        <name_last>{currentApplicant.lastName}</name_last>
        <name_first>{currentApplicant.firstName}</name_first>
        <bankrupt>{currentApplicant.currentlyBankrupt}</bankrupt>
        <balance_remaining>{currentApplicant.availableCCCredit}</balance_remaining>
        <risk_estimate>{currentApplicant.approvalLevel}</risk_estimate>
        <score_info>
            {financialservices.CreditScript.calcScoreInfo(currentApplicant)}
        </score_info>
    </applicant>
    <notes>{responseMessage}</notes>
</onCreditReportDone>
  1. [OK] をクリックして、[マップおよびインタフェースの編集] ダイアログを閉じます。

この XML マップ全体を通じて、{} で囲まれたテキストは、コールバックのパラメータ m_currentApplicant からの値を挿入するよう WebLogic Server に指示しています。また、マップの <score_info> 要素を見ると、{} 内のコードは、記述済みのスクリプトを使用してコールバックの m_currentApplicant パラメータを変換するよう WebLogic Server に指示しています。

テスト ビューを起動するには

  1. [開始] ボタンをクリックすると、これまでと同様、Web ブラウザにテスト ビューが表示されます。

  2. [taxID] ボックスにいずれかの納税者 ID 番号(たとえば、111111111)を入力して、requestCreditReportAsynch をクリックします。

  3. [Message Log] に callback.onCreditReportDone が表示されるまで、[更新] ボタンをクリックしてテスト ビューを再ロードします。

  4. [callback.onCreditReportDone] をクリックします。その結果、画面表示は次のようになります。

このチュートリアルの前のステップでの onCreditReportDone の結果と上の画像を比較してみると、XML マップによって結果が大きく変わっていることがわかります。これは、特定のクライアントが使用できるように、マップで送信 XML メッセージを成形したためです。

次のステップでは、サービスの結果をより汎用性の高いフォーマットで返すようにサービスのデザインを拡張して、より広範にサービスを利用できるようにします。

関連トピック

XML マップを使用する理由

XML マップ入門

マッピング用スクリプト入門

チュートリアルの前後のステップに移動するには、次のいずれかの矢印をクリックしてください。