プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle SOA SuiteでのSOAアプリケーションの開発
12c (12.1.3)
E53007-05
目次へ移動
目次

前
次

55 Spring Frameworkを使用したSOAコンポジット・アプリケーションへの統合

この章では、Spring Frameworkを使用して、Javaインタフェースを使用するコンポーネントをSOAコンポジット・アプリケーションに統合する方法について説明します。Oracle SOA Suiteでは、Oracle WebLogic ServerのWebLogic Service Component Architecture (SCA)で提供されるSpring Framework機能を使用します。また、この章では、Javaインタフェースを使用するコンポーネントとWSDLファイルを使用するコンポーネントを同じSOAコンポジット・アプリケーション内に統合する方法についても説明します。また、JavaクラスをXMLデータにマップするための、Java Architecture for XML Binding (JAXB)およびEclipseLink O/X-Mapper (OXM)の使用についても説明します。

この章の内容は次のとおりです。

Oracle SOA Suiteで使用するWebLogic SCA機能の詳細は、『Oracle WebLogic Server WebLogic SCAアプリケーションの開発』を参照してください。

Spring Frameworkの使用方法の例は、Oracle SOA Suiteのサンプルのサイトを参照してください。

55.1 Springサービス・コンポーネントの概要

Spring Frameworkは、様々なタイプのサービスを簡単に使用できるようにする軽量のコンテナです。この軽量のコンテナは、特定のタイプのコンポーネントではなく、すべてのJavaBeanを受け入れることができます。

WebLogic SCAによって、ユーザーはSpring Frameworkを使用して、plain old Java object (POJO)を使用するJavaアプリケーションを作成し、コンポーネントをSCAサービスおよび参照として公開できます。SCAの観点では、WebLogic Spring Framework SCAアプリケーションは、各クラスをSCAサービスおよび参照と結び付けるSpring SCA コンテキスト・ファイルとPOJOの集合です。

Spring Frameworkを使用すると、サービス・コンポーネントを作成し、依存関係インジェクション機能を使用してSOAコンポジット・アプリケーション内に接続できます。Spring Framework機能は、SCAによって次のように拡張できます。

  • Spring Beanを、他のSCAコンポーネントまたはリモート・クライアントがアクセスできるSCAコンポーネント・サービスとして公開します。

  • 他のコンポーネントのサービスに接続されたサービス参照のSpring Beanを提供します。

すべてのサービス・コンポーネントと同様に、Springコンポーネントはcomposite.xmlファイルで定義されます。composite.xmlファイルで定義されたSpringコンポーネントには、binding.javaを使用するサービスおよび参照要素があります。

サービスはBeanによって実装され、Springコンテキスト・ファイルでターゲット設定されます。参照は、実行時に暗黙的(または仮想的)なBeanとしてSpringコンテキスト・ファイルで提供されます。

Javaインタフェースを使用してEnterprise JavaBeans (EJB)をSOAコンポジット・アプリケーションに統合することもできます(SDOパラメータは不要です)。詳細は、「Enterprise JavaBeansとコンポジット・アプリケーションの統合」を参照してください。

55.2 同じSOAコンポジット・アプリケーション内でのJavaベース・コンポーネントとWSDLベース・コンポーネントの統合

SOAコンポジット・エディタを使用して、Javaインタフェースを使用するコンポーネントとWSDLファイルを同じSOAコンポジット・アプリケーション内で統合できます。この統合によって、たとえば、Springサービス・コンポーネントでOracle BPEL Process Managerを起動したり、Oracle Mediatorサービス・コンポーネントでEJBを起動することができます。

次のタイプのコンポーネント統合がサポートされています。

  • JavaコンポーネントからWSDLコンポーネント

    Javaインタフェース(EJBサービス、Springサービス・コンポーネントなど)からJavaインタフェースをサポートしていないコンポーネント(Oracle MediatorOracle BPEL Process Managerなど)にワイヤをドラッグすると、コンポーネント・インタフェースに対して互換性のあるWSDLが生成されます。

  • WSDLコンポーネントからJavaコンポーネント

    WSDLインタフェースから、WSDLファイルをサポートしていないコンポーネント(Springサービス・コンポーネントなど)にワイヤをドラッグすると、互換性のあるJavaインタフェースが自動的に生成されます。さらに、既存のWSDLインタフェースを既存のJavaインタフェースに接続することも可能です。この場合、WSDLインタフェースとJavaインタフェース間の互換性はチェックされません。互換性が適正であることを確認する必要があります。

  • JavaコンポーネントからJavaコンポーネント

    Springサービス・コンポーネントの作成時には、Javaインタフェース・ベースのEJBサービス・バインディング・コンポーネントと参照バインディング・コンポーネントを使用して、Springサービス・コンポーネントを自動的に構成できます。WSDLファイルは不要です。

55.2.1 JavaベースおよびWSDLベースの統合例

2つのサービス・コンポーネント(またはサービス・コンポーネントとバインディング・コンポーネント)を接続するときは、接続の両端にインタフェースを定義します。XMLを使用する場合、これらのインタフェースで同じWSDL定義を指定する必要があり、composite.xmlファイルのinterface.wsdlを使用して定義されます。

JAX-WSの観点からは、(interface.javaで定義された)JavaインタフェースをWSDLインタフェースに接続すると、2つのインタフェースは互換性があるとみなされます。通常、これはOracle JDeveloperで規定され自動化されます。

注意:

この項で説明するcomposite.xmlおよびSpringコンテキスト・ファイルの作成および変更には、「設計」ビューでOracle JDeveloperのみを使用します。これらのファイルは、「ソース」ビューで直接編集しないでください。次の各例は、JavaインタフェースとWSDLファイルをSOAコンポジット・アプリケーションに統合する方法を示しています。Oracle JDeveloperを使用してこの機能を実現する方法については、この章の後続の項で説明します。

たとえば、次の例に示すように、サービスのJavaインタフェースがあるとします。

public interface PortfolioService {
  public double getPorfolioValue(String portfolioId);
}

実装では、別のコンポーネント(外部Webサービス、EJBなど)によって実装された追加のStockQuoteサービスを使用できるとします。次の例に詳細を示します。

public interface StockQuote {
  public double getQuote (String symbol);
}

Spring Frameworkのcomposite.xmlファイルには、interface.java定義を使用するPortfolioServiceサービスおよびStockQuoteサービスがリストされます。次の例に詳細を示します。

<component name="PortfolioComp">
    <implementation.spring src="Spring/PortfolioComp.xml"/>
    <componentType>
      <service name="PortfolioService">
        <interface.java interface="com.bigbank.PortfolioService"/>
      </service>
      <reference name="StockService">
        <interface.java interface="com.bigbank.StockQuote"/>
      </reference>
    </componentType>
  </component>

実装クラスによって、サービス・インタフェースが実装され、参照インタフェースのセッターが提供されます。次の例に詳細を示します。

public class PortfolioServiceImpl implements PortfolioService {
  StockQuote stockQuoteRef;

  public void setStockService (StockQuote ref) {
    stockQuoteRef = ref;
  }

  public double getPorfolioValue(String portfolioId) {
    //--  use stock service
    //--  return value
  }
}

Springコンテキスト・ファイルは、サービスおよび参照をコールアウトして実装にバインドします。次の例に詳細を示します。

<beans ...>
  <sca:service  name="PortfolioService" type="com.bigbank.PortfolioService"
 target="impl">
  </sca:service>

  <sca:reference  name="StockService" type="com.bigbank.StockQuote">
  </sca:reference>

  <bean id ="impl" class ="com.bigbank.PortfolioServiceImpl">
     <property name="stockService" ref="StockService"/>
  </bean>
</beans>

55.2.2 Spring Frameworkでのコールバックの使用

Oracle SOA Suiteでは、interface.wsdlおよびinterface.javaの両方でコールバックを使用します。ただし、Spring Frameworkにはコールバックの概念が存在しません。Oracle SOA Suiteのサービスおよび参照の場合、コールバックは、interface.wsdlの2番目のポート・タイプ、またはinterface.javaの2番目のJava名として(メタデータに)指定されます。Springメタデータには、sca:servicesおよびsca:referencesのみが含まれ、コールバックを指定する方法がありません。

Springでコールバックを設計するには、特定の名前を指定したsca:servicesおよびsca:referencesを用意する必要があります。命名規則のsomeServiceおよびsomeServiceCallbackを使用してsca:serviceおよびsca:referenceの両方を作成すると、Oracle SOA Suiteでは、この命名規則が認識され、コールバックがある単一のサービスまたは参照が作成されます。

たとえば、Oracle JDeveloperのSpringエディタを使用して、Springコンテキスト・ファイルに次の例に示すような構文を作成するとします。

<sca:service  name="StockService"
 type="oracle.integration.platform.blocks.java.callback.StockService"
 target="impl" />
 <sca:reference  name="StockServiceCallback"
 type="oracle.integration.platform.blocks.java.callback.StockServiceReply" />

Oracle SOA Suiteでは、次の例に示すように、単一のサービスを自動的に作成します。

    <service name="StockService">
      <interface.java
 interface="oracle.integration.platform.blocks.java.callback.StockService"   
           callbackInterface="oracle.integration.platform.blocks.java.callback.StockServiceRe
ply"/>
    </service>

SOAコンポジット・エディタで、コールバック・インタフェースがあるSpringのinterface.javaをWSDLコンポーネント(Oracle BPEL Process ManagerOracle Mediatorなど)にドラッグすると、2つのポート・タイプがあるWSDLが生成されます(技術的にはラッパーWSDLと呼ばれ、それぞれ単一のポート・タイプがある別の2つのWSDLをインポートするWSDLです)。

コールバックがあるWSDLインタフェースまたはJavaインタフェースをSpringサービス・コンポーネントにドラッグすると、SOAコンポジット・エディタには単一のインタフェースが表示されます。ただし、Springエディタには、同じ命名規則(someServiceおよびsomeServiceCallback)を使用するsca:serviceおよびsca:referenceの両方が表示されます。

55.3 Oracle JDeveloperでのSpringサービス・コンポーネントの作成

この項では、Oracle JDeveloperでSpringサービス・コンポーネントを作成し、そのコンポーネントを次のように接続する方法について説明します。

  • Javaインタフェース・ベースのEJBサービスおよび参照への接続(JavaからJavaへの統合)

  • Oracle Mediatorサービス・コンポーネントへの接続(JavaからWSDLへの統合)

55.3.1 Oracle JDeveloperでのSpringサービス・コンポーネントの作成方法

Oracle JDeveloperでSpringサービス・コンポーネントを作成する手順は、次のとおりです。

  1. 図55-1に示すように、「コンポーネント」ウィンドウで、「Spring」サービス・コンポーネントをにドラッグします。

    図55-1 「Springコンテキスト」サービス・コンポーネント

    図55-1の説明が続きます
    「図55-1 「Springコンテキスト」サービス・コンポーネント」の説明

    「Springの作成」ダイアログが表示されます。

  2. 「名前」フィールドに、Springサービス・コンポーネントの名前を入力します。この名前は、コンポーネント名とSpringコンテキスト・ファイル名の両方になります。図55-2に詳細を示します。

    既存のコンテキストの使用を選択し、「参照」をクリックして、既存のSpringファイルを選択することもできます。たとえば、Oracle JDeveloperで作成されたがOracle SOA Suiteの外部にあるSpringコンテキストをインポートできます。別のプロジェクトから参照して選択したSpringコンテキストは、SOAプロジェクトにコピーされます。

    図55-2 「Springの作成」ダイアログ

    図55-2の説明が続きます
    「図55-2 「Springの作成」ダイアログ」の説明

    注意:

    WebLogic SCAのスタンドアロンのSpringバージョンも使用可能です。通常、このバージョンはOracle SOA Suiteの外部で使用されます。このバージョンにアクセスするには、Springエディタ内での作業中に、「コンポーネント」ウィンドウからSpring 2.5 JEEを選択します。

  3. 「OK」をクリックします。

    SOAコンポジット・エディタにSpringアイコンが表示されます。

  4. コンテンツが自動的に表示されない場合は、このアイコンをダブルクリックすると、SpringエディタにSpringコンテキストの内容が表示されます。

  5. 「コンポーネント」ウィンドウで、ドロップダウン・リストから「WebLogic SCA」を選択します。

    リストがリフレッシュされ、図55-3に示すように、選択内容が表示されます。

    図55-3 「WebLogic SCA」メニュー

    図55-3の説明が続きます
    「図55-3 「WebLogic SCA」メニュー」の説明
  6. 「サービス」アイコンをSpringエディタにドラッグします。

    「サービスの挿入」ダイアログが表示されます。

  7. 表55-1に示すフィールドに入力して、ターゲットBeanおよびJavaインタフェースを定義します。


    表55-1 「サービスの挿入」ダイアログ

    フィールド 説明

    名前

    名前を入力します。

    ターゲット

    ターゲットBeanを入力します。このアクションにより、Beanをサービスとして公開できます。

    注意: このターゲットが存在していることを確認してください。このターゲットの存在をチェックする検証機能はサポートされていません。

    タイプ

    Javaインタフェースを入力します。


    完了すると、「サービスの挿入」ダイアログは図55-4のようになります。

    図55-4 「サービスの挿入」ダイアログ

    図55-4の説明が続きます
    「図55-4 「サービスの挿入」ダイアログ」の説明
  8. 「OK」をクリックします。

    ターゲットBeanは、Springコンテキストでサービス・インタフェースになります。

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:util="http://www.springframework.org/schema/util"
           xmlns:jee="http://www.springframework.org/schema/jee"
     xmlns:lang="http://www.springframework.org/schema/lang"
           xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:sca="http://xmlns.oracle.com/weblogic/weblogic-sca"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/tool
     http://www.springframework.org/schema/tool/spring-tool.xsd
     http://www.springframework.org/schema/util
     http://www.springframework.org/schema/util/spring-util.xsd
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop.xsd
     http://www.springframework.org/schema/cache
     http://www.springframework.org/schema/cache/spring-cache.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/task
     http://www.springframework.org/schema/task/spring-task.xsd
     http://www.springframework.org/schema/jee
     http://www.springframework.org/schema/jee/spring-jee.xsd
     http://www.springframework.org/schema/lang
     http://www.springframework.org/schema/lang/spring-lang.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx.xsd
     http://www.springframework.org/schema/jdbc
     http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
     http://www.springframework.org/schema/jms
     http://www.springframework.org/schema/jms/spring-jms.xsd
     http://www.springframework.org/schema/oxm
     http://www.springframework.org/schema/oxm/spring-oxm.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc.xsd
     http://xmlns.oracle.com/weblogic/weblogic-sca META-INF/weblogic-sca.xsd">
      <!--Spring Bean definitions go here-->
      <sca:service name="scaserv1" target="cp"
     type="oracle.mypackage.myinterface"/>
    </beans>
    

    Springエディタを閉じてSOAコンポジット・エディタに戻ると、図55-5に示すように、Springサービス・コンポーネントの左側にハンドルが追加されています。

    図55-5 サービス・ハンドル

    図55-5の説明が続きます
    「図55-5 サービス・ハンドル」の説明
  9. Springエディタに戻ります。

  10. 図55-3に示すリストから、「参照」アイコンをSpringエディタにドラッグします。

    「参照の挿入」ダイアログが表示されます。

  11. 表55-2に示すようにダイアログに入力して、「OK」をクリックします。


    表55-2 「参照の挿入」ダイアログ

    フィールド 説明

    名前

    名前を入力します。

    タイプ

    Javaインタフェースを入力します。


    完了すると、Springエディタに、Springコンテキストのサービスおよび参照が表示されます。

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:util="http://www.springframework.org/schema/util"
          xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:lang="http://www.springframework.org/schema/lang"
          xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:sca="http://xmlns.oracle.com/weblogic/weblogic-sca"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tool
    http://www.springframework.org/schema/tool/spring-tool.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/cache
    http://www.springframework.org/schema/cache/spring-cache.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task.xsd
    http://www.springframework.org/schema/jee
    http://www.springframework.org/schema/jee/spring-jee.xsd
    http://www.springframework.org/schema/lang
    http://www.springframework.org/schema/lang/spring-lang.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/jdbc
    http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    http://www.springframework.org/schema/jms
    http://www.springframework.org/schema/jms/spring-jms.xsd
    http://www.springframework.org/schema/oxm
    http://www.springframework.org/schema/oxm/spring-oxm.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://xmlns.oracle.com/weblogic/weblogic-sca META-INF/weblogic-sca.xsd">
     <!--Spring Bean definitions go here-->
     <sca:service name="scaserv1" target="cp"
    type="oracle.mypackage.myinterface"/>
     <sca:reference name="scaref1" type="external.bean.myInterface"/>
    </beans>
    
  12. 図55-6に示すように、Springコンテキスト・ファイルを閉じます。

    図55-6 Springコンテキスト・ファイル

    図55-6の説明が続きます
    「図55-6 Springコンテキスト・ファイル」の説明

    図55-7に示すように、Springサービス・コンポーネントの右側にハンドルが追加されています。

  13. 図55-8に示すように、左側のハンドルを「公開されたサービス」スイムレーンにドラッグして、サービス・バインディング・コンポーネントを作成します。

    図55-8 サービス・バインディング・コンポーネント

    図55-8の説明が続きます
    「図55-8 サービス・バインディング・コンポーネント」の説明

    図55-9に示すように、サービスをWebサービスとして公開するか、またはEJBサービスとして公開するかを選択するように求めるプロンプトが表示されます。

    図55-9 作成するサービス・タイプ

    図55-9の説明が続きます
    「図55-9 作成するサービス・タイプ」の説明
    • EJB: EJBサービスをJavaインタフェースから公開します。このオプションを選択した場合、WSDLファイルを使用する必要はありません。

    • Webサービス: WebサービスをSOAP WSDLインタフェースから公開します。このオプションを選択すると、Springサービス・コンポーネントとの互換性を維持するために、JavaインタフェースからWSDLが生成されます。

  14. このサービスをEJBサービスとして公開するか、またはWebサービスとして公開するかを選択します。「公開されたサービス」スイムレーンにサービスが自動的に作成され、Springサービス・コンポーネントに接続されます(この例では「EJB」が選択されています)。図55-10に詳細を示します。

    図55-10 Springサービス・コンポーネントに接続されたEJBサービス・バインディング・コンポーネント

    図55-10の説明が続きます
    「図55-10 Springサービス・コンポーネントに接続されたEJBサービス・バインディング・コンポーネント」の説明
  15. EJBサービスをダブルクリックすると、図55-11に示すように、自動的に設定された構成が表示されます。この構成詳細は、ステップ7で「サービスの挿入」ダイアログに入力した値から作成されています。

    図55-11 「公開されたサービス」スイムレーンの「EJBサービス」ダイアログ

    図55-11の説明が続きます
    「図55-11 「公開されたサービス」スイムレーンの「EJBサービス」ダイアログ」の説明
  16. 自動的に生成されたデフォルトのJNDI名を、環境に適用可能な名前に置き換えます。

  17. ダイアログを閉じます。

  18. Springサービス・コンポーネントの右側のハンドルを「外部参照」スイムレーンにドラッグして、参照バインディング・コンポーネントを作成します。

    ステップ13で説明した内容と同じSpringタイプ・オプションのメッセージが表示されます。

  19. この参照を公開するオプションを選択します。「外部参照」スイムレーンに参照が自動的に作成され、Springサービス・コンポーネントに接続されます(この例では「EJB」が選択されています)。図55-12に詳細を示します。

    図55-12 Springサービス・コンポーネントに接続されたEJB参照バインディング・コンポーネント

    図55-12の説明が続きます
    「図55-12 Springサービス・コンポーネントに接続されたEJB参照バインディング・コンポーネント」の説明
  20. EJB参照をダブルクリックすると、図55-13に示すように、自動的に設定された構成が表示されます。この構成詳細は、ステップ11で「参照の挿入」ダイアログに入力した値から作成されています。

    図55-13 「外部参照」スイムレーンの「EJB参照」ダイアログ

    図55-13の説明が続きます
    「図55-13 「外部参照」スイムレーンの「EJB参照」ダイアログ」の説明
  21. ダイアログを閉じて、図55-14に示すようにSOAコンポジット・エディタに戻ります。

    図55-14 Javaインタフェース・ベースのEJBサービスおよびEJB参照バインディング・コンポーネント

    図55-14の説明が続きます
    「図55-14 Javaインタフェース・ベースのEJBサービスおよびEJB参照バインディング・コンポーネント」の説明
  22. サービスの右ハンドル(図55-15を参照)とSpringサービス・コンポーネントの左ハンドルの両方にカーソルを合せます(図55-16を参照)。Javaインタフェースが表示されます。

    図55-15 サービスのJavaインタフェース

    図55-15の説明が続きます
    「図55-15 サービスのJavaインタフェース」の説明

    図55-16 Springサービス・コンポーネントのJavaインタフェース

    図55-16の説明が続きます
    「図55-16 Springサービス・コンポーネントのJavaインタフェース」の説明
  23. Springサービス・コンポーネントの右ハンドル、および参照バインディング・コンポーネントの左ハンドルでも同様にカーソルを置いて、Javaインタフェースを表示します。

  24. composite.xmlファイルの「ソース」ビューを選択して、同様の詳細を表示します。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- Generated by Oracle SOA Modeler version 12.1.3.0.0 at [5/16/14 3:05 AM].
     -->
    <composite name="Project1"
    . . .
    . . . 
    <service name="scaserv1">
      <interface.java interface="oracle.mypackage.myinterface"/>
      <binding.ejb uri="scaserv1_ejb_ep" ejb-version="EJB3"/>
    </service>
    <property name="productVersion" type="xs:string"
     many="false">12.1.3.0.0</property>
    <property name="compositeID" type="xs:string"
     many="false">4c07dbf0-5c01-450e-bde6-8c3866f45edc</property>
    <component name="MySpring">
      <implementation.spring src="Spring/MySpring.xml"/>
      <componentType>
        <service name="scaserv1">
          <interface.java interface="oracle.mypackage.myinterface"/>
        </service>
        <reference name="scaref1">
          <interface.java interface="external.bean.myInterface"/>
        </reference>
      </componentType>
    </component>
    <reference name="scaref1">
      <interface.java interface="external.bean.myInterface"/>
      <binding.ejb uri="scaref1_ejb_ep" ejb-version="EJB3"/>
    </reference>
    <wire>
      <source.uri>scaserv1</source.uri>
      <target.uri>MySpring/scaserv1</target.uri>
    </wire>
    <wire>
      <source.uri>MySpring/scaref1</source.uri>
      <target.uri>scaref1</target.uri>
    </wire>
    </composite>  
    
  25. Springサービス・コンポーネントの右ハンドルを、Javaインタフェース・ベースのEJB参照ではなく、XMLベースのコンポーネント(Oracle Mediatorなど)に接続すると、Oracle Mediatorの既存のWSDLインタフェースからJavaインタフェースが生成されます。次の手順で詳細を説明します。

    1. 図55-17に示すように、Springサービス・コンポーネントの右ハンドルをOracle Mediatorにドラッグします。

      図55-17 Springサービス・コンポーネントとOracle Mediatorの統合

      図55-17の説明が続きます
      「図55-17 Springサービス・コンポーネントとOracle Mediatorの統合」の説明
    2. Oracle MediatorのWSDLファイルから互換性のあるインタフェースが作成されたことを確認するプロンプトが表示された場合は、「OK」をクリックします。

      図55-18 Oracle MediatorのWSDLファイルからのJavaファイル作成

      図55-18の説明が続きます
      「図55-18 Oracle MediatorのWSDLファイルからのJavaファイル作成」の説明

      JavaインタフェースとWSDLベース・コンポーネント間の接続をドラッグすると、(Javaインタフェース名に基づく)デフォルト名のWSDLファイルがすでに存在する場合、4つのオプションがプロンプトされます。接続の作成を取り消すには、「取消」をクリックします。図55-19に詳細を示します。

      図55-19 既存のWSDLファイル

      図55-19の説明が続きます
      「図55-19 既存のWSDLファイル」の説明
    3. Springサービス・コンポーネントの右ハンドル(図55-20を参照)とOracle Mediatorの左ハンドルの両方にカーソルを合せ(図55-21を参照)、互換性のあるインタフェースを表示します。

      図55-20 Springサービス・コンポーネントのインタフェース

      図55-20の説明が続きます
      「図55-20 Springサービス・コンポーネントのインタフェース」の説明

      図55-21 Oracle Mediatorのインタフェース

      図55-21の説明が続きます
      「図55-21 Oracle Mediatorのインタフェース」の説明
    4. Springサービス・コンポーネントをダブルクリックすると、SpringエディタにSpringコンテキスト・ファイルの内容が表示されます。

      <?xml version="1.0" encoding="windows-1252" ?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:util="http://www.springframework.org/schema/util"
             xmlns:jee="http://www.springframework.org/schema/jee"
             xmlns:lang="http://www.springframework.org/schema/lang"
             xmlns:aop="http://www.springframework.org/schema/aop"
             xmlns:tx="http://www.springframework.org/schema/tx"
             xmlns:sca="http://xmlns.oracle.com/weblogic/weblogic-sca"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
              http://www.springframework.org/schema/util
              http://www.springframework.org/schema/util/spring-util-2.5.xsd
              http://www.springframework.org/schema/aop
              http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
              http://www.springframework.org/schema/jee
              http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
              http://www.springframework.org/schema/lang
              http://www.springframework.org/schema/lang/spring-lang-2.5.xsd
              http://www.springframework.org/schema/tx
              http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
              http://www.springframework.org/schema/tool
              http://www.springframework.org/schema/tool/spring-tool-2.5.xsd
              http://xmlns.oracle.com/weblogic/weblogic-sca META-INF/weblogic-sca.xsd">
        <!--Spring Bean defintions go here-->
        <sca:service name="scaserv1" target="ep" type="oracle.mypackage.myinterface"/>
        <sca:reference type="mediator1.project1.application4.com.oracle.xmlns.Execute_
      ptt" name="Mediator1.Mediator1"/>
      </beans>

注意:

  • Javaインタフェースを使用するコンポーネントとWSDLファイルを使用するコンポーネントとをSOAコンポジット・エディタで統合する際に、特定のインタフェース・クラスがクラスパスになく(SCA-INF/libディレクトリにあるJARファイルを含む)、ソース・ファイルがSOAプロジェクトに存在する場合は、ソースを自動的にコンパイルするように要求されます。

  • Javaインタフェースを使用するサービスとのBPELプロセスのパートナ・リンクを作成することもできます。パートナ・リンクの作成時に、「サービス・エクスプローラ」ダイアログでこのサービスのタイプを選択します。詳細は、「パートナ・リンクの概要」を参照してください。

55.3.2 JavaからWSDLへの変換時のJavaクラス・エラーに関する必知事項

JavaからWSDLへの変換が不正なJavaクラスにより失敗し、問題に対処するためJavaコードを変更した場合は、Oracle JDeveloperを再起動する必要があります。そうしないと、新規クラスが再ロードされないためにJavaからWSDLへの変換が失敗します。

55.4 グローバルSpringコンテキストを介したカスタムSpring Beanの定義

カスタムSpring Beanは、グローバルSpringコンテキスト定義を介して定義できます。この構成では、グローバル・レベルで1回のみ、これらのBeanを定義できます。

55.4.1 グローバルSpringコンテキストを介したカスタムSpring Beanの定義方法

グローバルSpringコンテキストを介してカスタムSpring Beanを定義する方法は、次のとおりです。

  1. カスタムSpring Bean定義を次のファイルに追加します。
    SOA_HOME/soa/modules/oracle.soa.ext_11.1.1/classes/
    springse-extension-global-beans.xml
    
  2. 対応するクラスをlibディレクトリ(JARファイルとして)またはクラス・ディレクトリ(JARファイルの抽出ファイルとして)に追加します。
    SOA_HOME/soa/modules/oracle.soa.ext_11.1.1/lib | classes
    

詳細は、次のディレクトリにあるreadme.txtファイルを参照してください。

SOA_HOME/soa/modules/oracle.soa.ext_11.1.1

注意:

新しく追加されたSpring Beanを使用するにはサーバーを再起動する必要があります。

55.5 事前定義済のSpring Beanの使用

Oracle SOA Suiteには、次の事前定義済のSpring Beanがあります。

  • headerHelperBean: ヘッダー・プロパティを取得および設定します。

  • instanceHelperBean: 次の情報を取得および設定します。

    • 現在実行中のフロー・インスタンスのインスタンスID。

    • 現在実行中のコンポーネント・インスタンスのインスタンスID。

    • コンポーネントが含まれているコンポジットの識別名(DN)。

    • Springサービス・コンポーネントの名前。

  • loggerBean: コンテキスト対応のロギング・メッセージの提供。

事前定義済のSpring Beanは、Springサービス・コンポーネントに自動的に挿入されます。ただし、Springコンテキスト・ファイル内にそのBeanへの参照を挿入することで事前定義済のSpring BeanをSOAコンポジット・アプリケーションに明示的に統合する必要があります。

Springコンテキスト・ファイル内のloggerBeanおよびheaderHelperBeanの参照方法の例は、「Springコンテキスト・ファイル内の事前定義済Spring Beanの参照方法」を参照してください。

55.5.1 headerHelperBeanのIHeaderHelperBean.javaインタフェース

次の例は、headerHelperBean BeanのIHeaderHelperBean.javaインタフェースを示しています。

package oracle.soa.platform.component.spring.beans;
/**
 * Interface for getting and setting header properties.
 * These properties will be set on the normalized message - and passed on
 * to the respective reference that the local reference is wired to on 
 * composite level.
 * <br/>
 * To use this bean from within your context, declare property
 * with ref="headerHelperBean". E.g.
 * &lt;property name="headerHelper" ref="<b>headerHelperBean</b>"/>
 */
public interface IHeaderHelperBean 
{
    /**
     * Get a property from the normalized message header. Note that these
     * properties are defined, and are the same ones, one can get/set via
     * mediator or bpel process
     * @param pKey the property key, case sensitive
     * @return the value, or null in case not found
     */
    public String getHeaderProperty (String pKey);
    /**
     * Set a property on the normalized message header. Note that these
     * properties are defined, and are the same ones, one can get/set via
     * mediator or bpel process
     * @param pKey the property key, case sensitive
     * @param pValue the value to be set
     */
    public void setHeaderProperty (String pKey, String pValue); 
}

55.5.2 instancerHelperBeanのIInstanceHelperBean.javaインタフェース

次の例は、instanceHelperBean BeanのIInstanceHelperBean.javaインタフェースを示しています。

package oracle.soa.platform.component.spring.beans;

import oracle.integration.platform.instance.engine.ComponentInstanceContext;
/**
 * Instancehelper Bean, gives access to composite / component + instance
 information
 * <br/>
 * To use this bean from within your context, declare property
 * with ref="instanceHelperBean". E.g.
 * &lt;property name="instanceHelper" ref="<b>instanceHelperBean</b>"/>
 */
public interface IInstanceHelperBean 
{    
  /**
   * Returns the instance id of the composite instance currently running 
   * @return the composite instance id
   */
  public String getCompositeInstanceId ();
  
  /**
   * Returns the instance id of the component instance currently running 
   * @return the component instance id
   */
  public String getComponentInstanceId ();
  
  /**
   * Returns the composite dn containing this component
   * @return the composite dn
   */
  public String getCompositeDN ();
  
  /**
   * Returns the name of this spring component 
   * @return the component name
   */
  public String getComponentName ();
  
}

55.5.3 loggerBeanのILoggerBean.javaインタフェース

次の例は、loggerBean BeanのILoggerBean.javaインタフェースを示しています。

package oracle.soa.platform.component.spring.beans;

import java.util.logging.Level;

/**
 * Logger bean interface, messages will be logged as
 * [&lt;composite instance id>/&lt;component instance id>] &lt;message>
 * <br/>
 * To use this bean from within your context, declare property
 * with ref="loggerBean". E.g.
 * &lt;property name="logger" ref="<b>loggerBean</b>"/>
 */
public interface ILoggerBean 
{

  /**
   * Log a message, with Level.INFO
   * @param message
   */
  public void log (String message);
  
  /**
   * Log a message with desired level
   * @param pLevel the log level
   * @param message the message to log
   */
  public void log (Level pLevel, String message);
  
  /**
   * Log a throwable with the desired level
   * @param level the level to log with
   * @param message the message
   * @param th the exception (throwable) to log
   */
  public void log (Level level, String message, Throwable th);
    
}

55.5.4 Springコンテキスト・ファイル内の事前定義済Spring Beanの参照方法

Springコンテキスト・ファイル内の事前定義済Beanへの参照を作成します。

Springコンテキスト・ファイル内の事前定義済Spring Beanを参照する方法は、次のとおりです。

  1. Oracle JDeveloper「ソース」ビューでSpringコンテキスト・ファイルを開きます。
  2. 事前定義済BeanのloggerBeanおよびheaderHelperBeanへの参照を追加します。
    <?xml version="1.0" encoding="windows-1252" ?>
    . . .
    . . .
      <!--
        The below sca:service(s) corresponds to the services exposed by the 
        component type file: SpringPartnerSupplierMediator.componentType
      -->  
      <!-- expose the InternalPartnerSupplierMediator + EJB as service 
        <service name="IInternalPartnerSupplier">
          <interface.java
     interface="com.otn.sample.fod.soa.internalsupplier.IInternalPartnerSupplier"/>
        </service>
      -->
      <sca:service name="IInternalPartnerSupplier"
            target="InternalPartnerSupplierMediator"
    type="com.otn.sample.fod.soa.internalsupplier.IInternalPartnerSupplier"/>
      <!-- expose the InternalPartnerSupplierMediator + Mock as service 
        <service name="IInternalPartnerSupplierSimple">
          <interface.java
     interface="com.otn.sample.fod.soa.internalsupplier.IInternalPartnerSupplier"/>
        </service>
      -->
      <sca:service name="IInternalPartnerSupplierSimple"
            target="InternalPartnerSupplierMediatorSimple"
    type="com.otn.sample.fod.soa.internalsupplier.IInternalPartnerSupplier"/>
      <!-- the partner supplier mediator bean with the mock ep -->               
      <bean id="InternalPartnerSupplierMediatorSimple" 
    class="com.otn.sample.fod.soa.internalsupplier.InternalSupplierMediator" 
            scope="prototype">
            <!-- inject the external partner supplier bean -->
            <property name="externalPartnerSupplier" 
                ref="IExternalPartnerSupplierServiceMock"/>
            <!-- inject the quoteWriter -->   
            <property name="quoteWriter" ref="WriteQuoteRequest"/>
            <!-- context aware logger, globally available bean [ps3] -->
            <property name="logger" ref="loggerBean"/>        
            <!-- headerHelper bean -->
            <property name="headerHelper" ref="headerHelperBean"/>
      </bean>      
      <!-- the partner supplier mediator bean with the ejb -->               
      <bean id="InternalPartnerSupplierMediator" 
    class="com.otn.sample.fod.soa.internalsupplier.InternalSupplierMediator" 
            scope="prototype">
            <!-- inject the external partner supplier bean -->
            <property name="externalPartnerSupplier" 
                ref="IExternalPartnerSupplierService"/>
            <!-- inject the quoteWriter -->   
            <property name="quoteWriter" ref="WriteQuoteRequest"/>
            <!-- context aware logger, globally available bean [ps3] -->
            <property name="logger" ref="loggerBean"/>      
            <!-- headerHelper bean -->
            <property name="headerHelper" ref="headerHelperBean"/>
      </bean>      
    . . .
    . . .

55.6 JAXBおよびOXMのサポート

Oracle Fusion Middlewareでは、JavaクラスをXMLデータにマップするために、JAXBおよびEclipseLink OXMの使用がサポートされています。これによって、データを任意のXML形式でメモリーに保存および取得できるため、プログラムのクラス構造に対する一連の固有なXMLルーチンの実装は不要です。このサポートによって、次の操作を実行できます。

  • XMLデータへのJavaオブジェクトのマップ

  • JavaオブジェクトへのXMLデータのマップ

JAXBマッピング用の外部メタデータの設計情報は、次のURLを参照してください。

http://wiki.eclipse.org/EclipseLink/DesignDocs/277920

JAXB OXMおよびOXMマッピング・ファイル(eclipselink-oxm.xsd)の詳細は、次のURLを参照してください。

http://wiki.eclipse.org/EclipseLink/FAQ/WhatIsMOXy

http://wiki.eclipse.org/EclipseLink/Examples/MOXy

http://wiki.eclipse.org/Category:XML

EJBをSOAコンポジット・アプリケーションに統合する場合は、JavaクラスをXMLデータにマップすることもできます。詳細は、「Enterprise JavaBeansとコンポジット・アプリケーションの統合」を参照してください。

55.6.1 拡張されたマッピング・ファイル

Oracle SOA Suiteでは、拡張されたマッピング(EXM)ファイルを使用することにより、JAXBおよびOXMファイルのサポートが拡張されています。EXMファイルが設計時プロジェクトのクラスパス内に存在する場合は、そのファイルをJavaからWSDLへの変換に使用できます。EXMファイルには、次の場合のデータ・バインディング・メタデータが用意されています。

  • JAXB注釈をJavaソースに追加できず、個別に指定する必要がある場合

  • シナリオがJAXBの対象外である場合(例: メソッドなど最上位レベル要素がタイプまたはパラメータ・タイプを戻す場合)

外部JAXB注釈は、EXMファイルに直接指定するか、またはEXMファイルから参照可能な個別のTopLink JAXBマッピングOXMファイルに含めることができます。

EXMファイル名はJavaクラス名と一致し、同じパッケージの場所に存在する必要があります。たとえば、Javaクラスの名前がpack1.pack2.myJavaInterface.classの場合、EXMファイルの名前はpack1/pack2/myJavaInterface.exmにする必要があります。

Oracle SOA Suiteでは、設計時に、EXMファイルをソース・パス(SCA-INF/src)またはクラスパス(SCA-INF/classes、またはSCA-INF/libのJAR)のいずれかに配置できます。

EXMファイルをソース・パス(SCA-INF/src)に配置すると、Oracle JDeveloperを使用してEXMを編集できます(クラスパス内のファイルはOracle JDeveloperの「アプリケーション」ウィンドウに表示されません)。プロジェクトのコンパイルが完了すると、EXMファイル(およびすべてのインポートされたXMLファイル)はデプロイメントのクラス・パス(SCA-INF/classes)にコピーされます。EXMファイルがソース・パスにある場合にも、対応する同じディレクトリ構造内にある必要があります。

EXM (およびOXM)ファイルをSCA-INF/srcに置く場合は、Oracle JDeveloperプロジェクトが、SCA-INF/srcがデフォルトのソース・ディレクトリになるように構成されていることを確認します(プロジェクト名を右クリックし、「プロジェクト・プロパティ」「Javaソースパス」を選択します)。EXMファイルは、プロジェクトのクラス・パスにあるJARファイルにもあります。

Javaインタフェース(Enterprise JavaBeans)をBPELプロセスにドラッグ・アンド・ドロップすると、Oracle SOA SuiteではEXMファイルが存在するかどうかが確認されます。存在する場合は、Webサービスjava2wsdl APIに渡されます。

WSDLファイルが生成された後、情報メッセージが表示されます。EXMファイルが使用された場合、メッセージは次の書式で表示されます。

The WSDL file {0} was generated based on the JAVA class {1} using extended mapping file {2}

EXMファイルの例を次に示します。

 <java-wsdl-mapping name="com.hello.sei.MyServiceEndpointInterface"
           xmlns="http://xmlns.oracle.com/weblogic/weblogic-wsee-databinding"
           xmlns:oxm="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
           databinding="toplink.jaxb">
  <xml-schema-mapping>
       <toplink-oxm-file java-package="com.hello.foo"  file-path="./foo-oxm.xml"/>
       <toplink-oxm      java-package="com.hello.coo">
            <xml-bindings
 xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
                <xml-schema
                    element-form-default="QUALIFIED"
                    attribute-form-default="UNQUALIFIED"
                    namespace="urn:customer">
                    <xml-ns prefix="ns1" namespace-uri="urn:customer" />
                </xml-schema>
                <java-types>
                    <java-type name="Person" xml-transient="true">
                        <java-attributes>
                            <xml-transient java-attribute="id"/>
                        </java-attributes>
                    </java-type>
                    <java-type name="Customer">
                        <xml-see-also>org.example.employee.Employee</xml-see-also>
                    </java-type>
                </java-types>
            </xml-bindings>
       </toplink-oxm>
  </xml-schema-mapping>
. . .
</java-wsdl-mapping>

データ・バインディング・フレームワークに対する外部マッピング・メタデータのEXMスキーマ・ファイルは、次のURLから入手できます。

http://www.oracle.com/technology/weblogic/weblogic-wsee-databinding/1.1/weblogic-wsee-databinding.xsd

このデータによって、特定のJava Webサービス・エンドポイントの属性が定義されます。このスキーマでは、次の3タイプのXMLコンストラクトが定義されます。

  • JAX-WSまたはJSR-181に類似したコンストラクト。このコンストラクトは、サービス・エンドポイント・インタフェース(SEI)の属性、およびSEIのインタフェースで使用される値タイプのJAXB注釈をオーバーライドまたは定義します。

  • 標準のJAX-WSまたはJAXB通知を使用しては使用できず、主にjava.util.Collections API.とともに使用する追加のマッピング仕様。

  • Toplink OXMファイルから外部JAXBマッピング・メタデータへの参照。

コンストラクトがJAX-WS、JSR-181またはJAXB注釈に非常に類似している場合、スキーマ内のコメントには、次のような注釈が表示されます。

Corresponding Java annotation: javax.jws.WebParam.Mode

55.7 Springサービス・コンポーネントによるGroovyおよびAspectjクラスの構成

Spring構成ファイルでGroovyまたはAspectjクラスを構成する場合は、次の規則に従う必要があります。

  • classpathプロトコルを使用します。

    script-source="classpath:"
    

    SCAパッケージはクラス・ローダーの通常のJARファイルとして処理されないため、相対ファイル・パスは使用できません。たとえば、次のclasspathプロトコルはクラス・パスからGroovyファイルを検索することを示します。

    script-source="classpath:service/GroovyGreeter.groovy"
    
  • classpathプロトコルを使用する場合は、GroovyファイルとAspectjファイルを次のいずれかのディレクトリに追加します。他のディレクトリは使用できません。

    • SCA-INF/classes

    • SCA-INF/lib

    • 共有SOA lib

    ビルド・スクリプトがclassesディレクトリを削除するように構成されている場合は、GroovyファイルをSCA-INF/libディレクトリに格納するか、またはビルド・スクリプトを削除が行われないように設計します。

  • GroovyまたはAspectjのSpring拡張JARファイル・ライブラリを管理対象サーバーのsetDomainENV.shまたはsetDomainENV.batファイルのクラス・パスに追加し、サーバーを再起動します。これにより、デプロイメントが正常に実行されることが保証されます。SpringではJavaリフレクションを使用してアスペクト指向プログラミング(AOP)がインスタンス化されるため、再起動が必要です。リフレクションの使用により、クラスの検索がシステム・クラス・ローダーに限定されます。システム・クラス・ローダーに変更を加えた場合は、サーバーの再起動が必要になります。

55.8 Springエラーのトラブルシューティング

この項では、Springサービス・コンポーネントのエラーをトラブルシューティングする方法を説明します。

55.8.1 起動するSpring Beanインタフェースが見つからない

SOAコンポジット・アプリケーションがあり、その中でBPELプロセスによってSpringコンテキストが起動されるとします。しかし、起動するためのSpring Beanインタフェースが見つかりません。管理サーバー診断ログ・ファイルに、次の例に示すエラーが表示されます。

[2012-04-09T10:30:07.499-07:00] [AdminServer] [NOTIFICATION] [SOA-31704]
[oracle.integration.platform.blocks.java] [tid: [ACTIVE].ExecuteThread: '2' for
queue: 'weblogic.kernel.Default (self-tuning)'] [userId: <anonymous>] [ecid:
11d1def534ea1be0:2058db3f:1369787a1b8:-8000-0000000000002be6,0:2] [WEBSERVICE_
PORT.name: SOACohSpringBPELProcess_pt] [APP: soa-infra] [composite_name:
SOACohSpringProj] [component_name: SOACohSpringBPELProcess] [component_instance_
id: 270006] [J2EE_MODULE.name: fabric] [WEBSERVICE.name: soacohspringbpelprocess_
client_ep] [J2EE_APP.name: soa-infra] No mapping found for class
SOACohSpringProj.CohEJBInterface.

その1つのクラスを含むJARファイルをSCA-INF/libディレクトリにデプロイするか、複数のクラスをSARファイルのSCA-INF/classesディレクトリにデプロイします。

55.8.2 SOAコンポジット・エディタでSpringサービス・コンポーネントを追加できない

Oracle SOA Suiteのクイック・スタート・インストールによって、Springエディタを起動するためのSpring拡張ファイルが自動的に組み込まれます。これにより、SOAコンポジット・エディタにSpringサービス・コンポーネントを正常に追加し、「Oracle JDeveloperでのSpringサービス・コンポーネントの作成方法」で説明しているように、「Springの作成」ダイアログを起動できます。

Oracle SOA Suiteの外部でOracle JDeveloperの標準インストールを使用する場合、Springエディタをインストールする必要があります。このためには、Oracle JDeveloper「ヘルプ」メイン・メニューで「更新の確認」を選択してから、更新センターでSpring拡張ファイルを選択します。これを行わなければ、Springサービス・コンポーネントをSOAコンポジット・エディタに追加し、「Springの作成」ダイアログを起動することが正常にできません。かわりに、図55-22に示すエラーが出されます。

図55-22 Spring使用不可エラー

図55-22の説明が続きます
「図55-22 Spring使用不可エラー」の説明