この章では、Spring Frameworkを使用して、Javaインタフェースを使用するコンポーネントをSOAコンポジット・アプリケーションに統合する方法について説明します。Oracle SOA Suiteでは、Oracle WebLogic ServerのWebLogic Service Component Architecture(SCA)で提供されるSpring Framework機能を使用します。また、この章では、Javaインタフェースを使用するコンポーネントとWSDLファイルを使用するコンポーネントを同じSOAコンポジット・アプリケーション内に統合する方法についても説明します。
項目は次のとおりです。
Oracle SOA Suiteで使用するWebLogic SCA機能の詳細は、Oracle Fusion Middleware Oracle WebLogic ServerのためのWebLogic SCAアプリケーションの開発を参照してください。
Spring Frameworkは、様々なタイプのサービスを簡単に使用できるようにする軽量のコンテナです。この軽量のコンテナは、特定のタイプのコンポーネントではなく、すべてのJavaBeanを受け入れることができます。
WebLogic SCAによって、ユーザーはSpring Frameworkを使用して、plain old Java object(POJO)を使用するJavaアプリケーションを作成し、コンポーネントをSCAサービスおよび参照として公開できます。SCAの用語であるWebLogic Spring Framework SCAアプリケーションは、POJOに、複数のクラスをSCAサービスや参照にまとめて接続するSpring SCAコンテキスト・ファイルを加えた集合です。
Spring Frameworkを使用すると、サービス・コンポーネントを作成し、依存関係インジェクション機能を使用してSOAコンポジット・アプリケーション内に接続できます。Spring Framework機能は、SCAによって次のように拡張できます。
Spring Beanを、他のSCAコンポーネントまたはリモート・クライアントがアクセスできるSCAコンポーネント・サービスとして公開します。
他のコンポーネントのサービスに接続されたサービス参照のSpring Beanを提供します。
すべてのサービス・コンポーネントと同様に、SpringコンポーネントにもcomponentType
ファイルがあります。componentType
ファイルに定義されているインタフェースは、interface.java
定義を使用してサービスおよび参照インタフェースを識別します。
サービスはBeanによって実装され、Springコンテキスト・ファイルでターゲット設定されます。参照は、実行時に暗黙的(または仮想的)なBeanとしてSpringコンテキスト・ファイルで提供されます。
Javaインタフェースを使用してEnterprise JavaBeansをSOAコンポジット・アプリケーションに統合することもできます(SDOパラメータは不要です)。詳細は、第36章「Enterprise JavaBeansとSOAコンポジット・アプリケーションの統合」を参照してください。
Spring Frameworkの詳細は、次のURLを参照してください。
http://www.osoa.org/display/Main/SCA+and+Spring+Framework
以前のリリースでは、SOAコンポジット・アプリケーション内のコンポーネントはすべてWSDLベースでした。このリリースからは、SOAコンポジット・エディタを使用して、Javaインタフェースを使用するコンポーネントとWSDLファイルを同じSOAコンポジット・アプリケーション内で統合できるようになりました。この統合によって、たとえば、Springサービス・コンポーネントでOracle BPEL Process Managerを起動したり、Oracle Mediatorサービス・コンポーネントでEnterprise JavaBeansを起動することができます。
次のタイプのコンポーネント統合がサポートされています。
JavaコンポーネントからWSDLコンポーネント
Javaインタフェース(Enterprise JavaBeansサービス、Springサービス・コンポーネントなど)からJavaインタフェースをサポートしていないコンポーネント(Oracle Mediator、Oracle BPEL Process Managerなど)にワイヤをドラッグすると、コンポーネント・インタフェースに対して互換性のあるWSDLが生成されます。
WSDLコンポーネントからJavaコンポーネント
WSDLインタフェースから、WSDLファイルをサポートしていないコンポーネント(Springサービス・コンポーネントなど)にワイヤをドラッグすると、互換性のあるJavaインタフェースが自動的に生成されます。さらに、既存のWSDLインタフェースを既存のJavaインタフェースに接続することも可能です。この場合、WSDLインタフェースとJavaインタフェース間の互換性はチェックされません。互換性が適正であることを確認する必要があります。
JavaコンポーネントからJavaコンポーネント
Springサービス・コンポーネントの作成時には、Javaインタフェース・ベースのEJBサービス・バインディング・コンポーネントと参照バインディング・コンポーネントを使用して、Springサービス・コンポーネントを自動的に構成できます。WSDLファイルは不要です。
2つのサービス・コンポーネント(またはサービス・コンポーネントとバインディング・コンポーネント)を接続するときは、接続の両端にインタフェースを定義します。これらのインタフェースには、XMLを使用して同じWSDL定義を指定する必要があるため、composite.xml
ファイルまたはcomponent
.componentType
ファイルのinterface.wsdl
を使用して定義します。
JAX-WSの観点からは、(interface.java
で定義された)JavaインタフェースをWSDLインタフェースに接続すると、2つのインタフェースは互換性があるとみなされます。通常、これはOracle JDeveloperで規定され自動化されます。
注意: この項で説明するcomposite.xml 、componentType およびSpringコンテキスト・ファイルの作成と変更には、Oracle JDeveloperのみを使用します。これらのファイルは、「ソース」ビューで直接編集しないでください。次の各例は、JavaインタフェースとWSDLファイルをSOAコンポジット・アプリケーションに統合する方法を示しています。Oracle JDeveloperを使用してこの機能を実現する方法については、この章の後続の項で説明します。 |
たとえば、例49-1に示すように、サービスのJavaインタフェースがあるとします。
例49-1 サービスのJavaインタフェース
public interface PortfolioService { public double getPorfolioValue(String portfolioId); }
実装では、別のコンポーネント(BPELプロセス、外部Webサービス、EJBなど)によって実装された追加のStockQuote
サービスを使用できるとします。例49-2に詳細を示します。
Spring FrameworkのcomponentType
ファイルには、interface.java
定義を使用してPortfolioService
サービスとStockQuote
サービスがリストされます。例49-3に詳細を示します。
例49-3 componentTypeファイル
<componentType xmlns="http://xmlns.oracle.com/sca/1.0"> <service name="PortfolioService "> <interface.java interface="com.bigbank.PortfolioService"/> </service> <reference name="StockService"> <interface.java interface="com.bigbank.StockQuote"/> </reference> </componentType>
実装クラスによって、サービス・インタフェースが実装され、参照インタフェースのセッターが提供されます。例49-4に詳細を示します。
例49-4 サービス・インタフェースの実装
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コンテキスト・ファイルは、サービスおよび参照をコールアウトして実装にバインドします。例49-5に詳細を示します。
例49-5 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>
コンポジットのcomposite.xml
ファイルには、コンポーネントと参照が定義されています。例49-6に詳細を示します。
例49-6 composite.xmlファイルでのコンポーネントと参照の定義
<composite ...> <import location="PortfolioService.wsdl" /> <service name="PortfolioService"> <interface.wsdl interface="http://bigbank.com/#wsdl.interface(PortfolioService)" /> <binding.ws port="http://bigbank.com/#wsdl.endpoint(PortfolioService/PortfolioServicePort)"/> </service> <wire> <source.uri>PortfolioService</source.uri> <target.uri>PortfolioComp/PortfolioService</target.uri> </wire> <component name="PortfolioComp"> <implementation.spring src="spring-context.xml"/> </component> <wire> <source.uri>PortfolioService/StockService</source.uri> <target.uri>StockService</target.uri> </wire> <reference name="StockService"> <interface.java interface="com.bigbank.StockQuote"/> <binding.ejb uri="StockService#com.bigbank.StockQuote"/> </reference> </composite>
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
を用意する必要があります。ネーミング規則のsome
Service
およびsome
ServiceCallback
を使用してsca:service
およびsca:reference
の両方を作成すると、Oracle SOA Suiteでは、このネーミング規則が認識され、コールバックがある単一のサービスまたは参照が作成されます。
たとえば、Oracle JDeveloperのSpringエディタを使用して、Springコンテキスト・ファイルに例49-7に示すような構文を作成するとします。
例49-7 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では、例49-8に示すように、単一のサービスをSpringのcomponentType
ファイルに自動的に作成します。
例49-8 単一のサービス
<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 Manager、Oracle Mediatorなど)にドラッグすると、2つのポート・タイプがあるWSDLが生成されます(技術的にはラッパーWSDLと呼ばれ、それぞれ単一のポート・タイプがある別の2つのWSDLをインポートするWSDLです)。
コールバックがあるWSDLインタフェースまたはJavaインタフェースをSpringサービス・コンポーネントにドラッグすると、SOAコンポジット・エディタには単一のインタフェースが表示されます。ただし、Springエディタには、同じネーミング規則(some
Service
およびsome
ServiceCallback
)を使用するsca:service
およびsca:reference
の両方が表示されます。
この項では、Oracle JDeveloperでSpringサービス・コンポーネントを作成し、そのコンポーネントを次のように接続する方法について説明します。
Javaインタフェース・ベースのEJBサービスおよび参照への接続(JavaからJavaへの統合)
Oracle Mediatorサービス・コンポーネントへの接続(JavaからWSDLへの統合)
Fusion Order DemoでのSpringサービス・コンポーネントの統合の概要は、第49.4項「Fusion Order DemoでのSpringサービス・コンポーネントの統合」を参照してください。
Oracle JDeveloperでSpringサービス・コンポーネントを作成する手順は、次のとおりです。
図49-1に示すように、「コンポーネント・パレット」からSpringコンテキスト・サービス・コンポーネントをSOAコンポジット・エディタにドラッグします。
「Springの作成」ダイアログが表示されます。
「名前」フィールドに、Springサービス・コンポーネントの名前を入力します。この名前は「新規コンテキストの作成」フィールドにも自動的に追加されます。図49-2に詳細を示します。
既存のコンテキストの使用を選択し、「参照」をクリックして、既存のSpringファイルを選択することもできます。たとえば、Oracle JDeveloperで作成されたがOracle SOA Suiteの外部にあるSpringコンテキストをインポートできます。別のプロジェクトから参照して選択したSpringコンテキストは、SOAプロジェクトにコピーされます。
注意: WebLogic SCAのスタンドアロンのSpringバージョンも使用可能です。通常、このバージョンはOracle SOA Suiteの外部で使用されます。このバージョンにアクセスするには、Springエディタ内での作業中に、「コンポーネント・パレット」からSpring 2.5 JEEを選択します。 |
「OK」をクリックします。
SOAコンポジット・エディタに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--> </beans>
「コンポーネント・パレット」のドロップダウン・リストから、「WebLogic SCA」を選択します。
リストがリフレッシュされ、図49-3に示すように、選択内容が表示されます。
「サービス」アイコンをSpringエディタにドラッグします。
「サービスの挿入」ダイアログが表示されます。
表49-1に示すフィールドに入力して、ターゲットBeanおよびJavaインタフェースを定義します。
表49-1 「サービスの挿入」ダイアログ
フィールド | 説明 |
---|---|
名前 |
名前を入力します。 |
ターゲット |
ターゲットBeanを入力します。このアクションにより、Beanをサービスとして公開できます。 注意: このターゲットが存在していることを確認してください。このターゲットの存在をチェックする検証機能はサポートされていません。 |
タイプ |
Javaインタフェースを入力します。 |
完了すると、「サービスの挿入」ダイアログは図49-4のようになります。
「OK」をクリックします。
ターゲットBeanは、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"/>
</beans>
Springエディタを閉じてSOAコンポジット・エディタに戻ると、図49-5に示すように、Springサービス・コンポーネントの左側にハンドルが追加されていることに注意してください。
Springエディタに戻ります。
図49-3に示すリストから、「参照」アイコンをSpringエディタにドラッグします。
「参照の挿入」ダイアログが表示されます。
表49-2に示すようにダイアログに入力して、「OK」をクリックします。
完了すると、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 name="scaref1" type="external.bean.myInterface"/> </beans>
図49-6に示すように、Springコンテキスト・ファイルを閉じます。
図49-7に示すように、Springサービス・コンポーネントの右側にハンドルが追加されていることに注意してください。
図49-8に示すように、左側のハンドルを「公開されたサービス」スイムレーンにドラッグして、サービス・バインディング・コンポーネントを作成します。
図49-9に示すように、サービスをWebサービスとして公開するか、またはEJBサービスとして公開するかを選択するように求めるプロンプトが表示されます。
EJB: EJBサービスをJavaインタフェースから公開します。このオプションを選択した場合、WSDLファイルを使用する必要はありません。
Webサービス: WebサービスをSOAP WSDLインタフェースから公開します。このオプションを選択すると、Springサービス・コンポーネントとの互換性を維持するために、JavaインタフェースからWSDLが生成されます。
このサービスをEJBサービスとして公開するか、またはWebサービスとして公開するかを選択します。「公開されたサービス」スイムレーンにサービスが自動的に作成され、Springサービス・コンポーネントに接続されます(この例では「EJB」が選択されています)。図49-10に詳細を示します。
図49-10 Springサービス・コンポーネントに接続されたEJBサービス・バインディング・コンポーネント
EJBサービスをダブルクリックすると、図49-11に示すように、自動的に設定された構成が表示されます。この構成詳細は、手順7で「サービスの挿入」ダイアログに入力した値から作成されています。
自動的に生成されたデフォルトのJNDI名を、環境に適用可能な名前に置き換えます。
ダイアログを閉じます。
Springサービス・コンポーネントの右側のハンドルを「外部参照」スイムレーンにドラッグして、参照バインディング・コンポーネントを作成します。
手順13で説明した内容と同じSpringタイプ・オプションのメッセージが表示されます。
この参照を公開するオプションを選択します。「外部参照」スイムレーンに参照が自動的に作成され、Springサービス・コンポーネントに接続されます(この例では「EJB」が選択されています)。図49-12に詳細を示します。
図49-12 Springサービス・コンポーネントに接続されたEJB参照バインディング・コンポーネント
EJB参照をダブルクリックすると、図49-13に示すように、自動的に設定された構成が表示されます。この構成詳細は、手順11で「参照の挿入」ダイアログに入力した値から作成されています。
ダイアログを閉じて、図49-14に示すようにSOAコンポジット・エディタに戻ります。
図49-14 Javaインタフェース・ベースのEJBサービスおよびEJB参照バインディング・コンポーネント
図49-15に示すように、カーソルをサービスの右ハンドルに置き、次に、図49-16に示すように、Springサービス・コンポーネントの左ハンドルに置きます。Javaインタフェースが表示されます。
Springサービス・コンポーネントの右ハンドル、および参照バインディング・コンポーネントの左ハンドルでも同様にカーソルを置いて、Javaインタフェースを表示します。
「アプリケーション・ナビゲータ」で、Springサービス・コンポーネントのcomponentType
ファイルを選択します。両方のコンポーネントのインタフェースは、interface.java
で定義されます。
<?xml version="1.0" encoding="UTF-8" ?> <!-- Generated by Oracle SOA Modeler version 1.0 at [2/27/10 1:13 PM]. --> <componentType xmlns="http://xmlns.oracle.com/sca/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ui="http://xmlns.oracle.com/soa/designer/"> <service name="scaserv1"> <interface.java interface="oracle.mypackage.myinterface"/> </service> <reference name="scaref1"> <interface.java interface="external.bean.myInterface"/> </reference> </componentType>
「アプリケーション・ナビゲータ」で、composite.xml
ファイルを選択して同様の詳細を表示します。
<service name="scaserv1"> <interface.java interface="oracle.mypackage.myinterface"/> <binding.ejb uri="scaserv1_ejb_ep" ejb-version="EJB3"/> </service> <component name="MySpring"> <implementation.spring src="MySpring.xml"/> </component> <reference name="scaref1"> <interface.java interface="external.bean.myInterface"/> <binding.ejb uri="scaref1_ejb_ep" ejb-version="EJB3"/> </reference> <wire> <source.uri>orderprocessor_client_ep</source.uri> <target.uri>OrderProcessor/orderprocessor_client</target.uri> </wire> <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>
Springサービス・コンポーネントの右ハンドルを、Javaインタフェース・ベースのEJB参照ではなく、XMLベースのコンポーネント(Oracle Mediatorなど)に接続すると、互換性のあるWSDLファイルが生成されます。次の手順で詳細を説明します。
図49-17に示すように、Springサービス・コンポーネントの右ハンドルをOracle Mediatorにドラッグします。
Oracle MediatorのWSDLファイルから互換性のあるインタフェースが作成されたことを確認するプロンプトが表示された場合は、「OK」をクリックします。
図49-19に示すように、カーソルをSpringサービス・コンポーネントの右ハンドルに置き、次に、図49-20に示すように、Oracle Mediatorの左ハンドルに置きます。
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コンポジット・アプリケーションに統合する方法の詳細は、第49.4項「Fusion Order DemoでのSpringサービス・コンポーネントの統合」を参照してください。
Fusion Order DemoのPartner Supplier Compositeアプリケーションは、Springサービス・コンポーネントを使用してパートナの倉庫から見積を取得する方法を提示します。図49-21に、このコンポジット・アプリケーションのSOAコンポジット・エディタを示します。
図49-21 Springサービス・コンポーネントを使用したPartner Supplier Composite
IInternalPartnerSupplier
は、外部クライアント・サービスとして「公開されたサービス」スイムレーンに公開されます。
Oracle Mediatorサービス・コンポーネントのPartnerSupplierMediator
は、見積金額に基づいてクライアント・リクエストを次のようにルーティングします。
$2000未満の見積は、Oracle BPEL Process Managerにルーティングされます。
$2000以上$3000未満のリクエストは、Springサービス・コンポーネントのSpringPartnerSupplierMediator
にルーティングされます。外部EJB参照バインディング・コンポーネントのIExternalPartnerSupplierService
が起動して見積を取得します。また、外部ファイル・アダプタのWriteQuoteRequest
が起動して見積結果をファイルに書き込みます。
$3000以上のリクエストは、Springサービス・コンポーネントのSpringPartnerSupplierMediator
にルーティングされます。ただし、このリクエストは外部EJB参照バインディング・コンポーネントにルーティングされません。かわりに、EJBインタフェースを実装することにより、内部的に処理されます。また、外部ファイル・アダプタのWriteQuoteRequest
が起動して見積結果をファイルに書き込みます。
図49-22に、この動作の概要を示します。
$2000以上$3000未満のリクエストの場合は、ターゲットBeanのInternalPartnerSupplierMediator
がサービスとして公開されます。ここでは、JavaインタフェースのIInternalPartnerSupplier
が使用されます。「外部参照」スイムレーンでは、JavaインタフェースのIExternalPartnerSupplierService
が外部EJBとして公開され、見積を取得します。
$3000以上のリクエストの場合は、ターゲットBeanのInternalPartnerSupplierMediatorSimple
がサービスとして公開されます。ここでは、JavaインタフェースのIInternalPartnerSupplier
が使用されます。内部JavaインタフェースのIExternalPartnerSupplierServiceMockを使用して、見積を取得します。「外部参照」スイムレーンのIExternalPartnerSupplierService
参照は起動されません。
「外部参照」スイムレーンでは、WriteQuoteRequest
参照でWSDLベースのファイル・アダプタが使用され、Javaインタフェースはサポートされていないため、互換性のあるWSDLファイルが生成されます。
例49-9に、IInternalPartnerSupplier.java
ファイルを示します。IInternalPartnerSupplier
はInternalSupplierMediator
によって実装されます。
例49-9 IInternalPartnerSupplier.javaファイル
package com.otn.sample.fod.soa.internalsupplier;
import
com.otn.sample.fod.soa.internalsupplier.exception.InternalSupplierException;
import java.util.List;
/**
* The interface for the spring based service, with a typed list.
*
* !!! ATTENTION !!!
* This interface was used to generate the wsdl
* (IInternalPartnerSupplierService.wsdl) - DO NOT MODIFY!
*
* @author clemens utschig
*/
public interface
IInternalPartnerSupplier
{
/**
* Get a price for a list of orderItems
* @param pOrderItems the list of orderitems
* @return the price
*/
public double getPriceForOrderItemList(List<Orderitem> pOrderItems)
throws InternalSupplierException;
}
例49-10のSpringPartnerSupplierMediator.componentType
ファイルは、図49-22に示すSpringサービス・コンポーネントに対して定義されたサービスおよび参照を示します。
例49-10 SpringPartnerSupplierMediator.componentTypeファイル
<?xml version="1.0" encoding="UTF-8" ?> <!-- Generated by Oracle SOA Modeler version 1.0 at [7/16/09 2:36 PM]. --> <componentType xmlns="http://xmlns.oracle.com/sca/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ui="http://xmlns.oracle.com/soa/designer/"> <service name="IInternalPartnerSupplier"> <interface.java interface="com.otn.sample.fod.soa.internalsupplier.IInternalPartnerSupplier"/> </service> <service name="IInternalPartnerSupplierSimple"> <interface.java interface="com.otn.sample.fod.soa.internalsupplier.IInternalPartnerSupplier"/> </service> <reference name="IExternalPartnerSupplierService"> <interface.java interface="com.otn.sample.fod.soa.externalps.IExternalPartnerSupplierService"/> </reference> <reference name="WriteQuoteRequest"> <interface.java interface="writequoterequest.partnersuppliercomposite.weblogicfusionorderdemo.file .adapter.pcbpel.com.oracle.xmlns.Write_ptt"/> </reference> </componentType>
例49-11に、Springコンテキスト・ファイルのSpringPartnerSupplierMediator.xml
を示します。
例49-11 Springコンテキスト・ファイルのSpringPartnerSupplierMediator.xml
<?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"> <!-- 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"/> </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"/> </bean> <!-- mock bean for the IExternalPartnerSupplierService --> <bean id="IExternalPartnerSupplierServiceMock" class="com.otn.sample.fod.soa.externalps.test.MockExternalPartnerSupplierTest"/> <!-- Use a reference from the outside world based on the IExternalPartnerSupplierService interface. The below is specified on the SpringPartnerSupplierMediator.componentType - and wired to an external EJB binding. <reference name="IExternalPartnerSupplierService"> <interface.java interface="com.otn.sample.fod.soa.externalps.IExternalPartnerSupplierService"/> </reference> --> <sca:reference name="IExternalPartnerSupplierService" type="com.otn.sample.fod.soa.externalps.IExternalPartnerSupplierService"/> <!-- <reference name="WriteQuoteRequest"> <interface.java interface="writequoterequest.partnersuppliercomposite.weblogicfusionorderdemo.file .adapter.pcbpel.com.oracle.xmlns.Write_ptt"/> </reference> --> <sca:reference type="writequoterequest.partnersuppliercomposite.weblogicfusionorderdemo.file.adap ter.pcbpel.com.oracle.xmlns.Write_ptt" name="WriteQuoteRequest"/> </beans>
Fusion Order Demoのダウンロードとインストール方法、およびPartner Supplier Compositeの使用方法の詳細は、第3.2項「Fusion Order Demoアプリケーションの設定」を参照してください。
ダウンロードした後は、次のFusion Order Demoディレクトリで、Partner Supplier Compositeで使用するJavaコードのサンプルを参照してください。
CompositeServices\PartnerSupplierComposite\src\com\otn\sample\fod\soa
Javaコードにはベクトルを含めることができます。ただし、コンテンツPOJOを宣言しないと、ベクトルをXMLにシリアライズできません。次の例では、この問題を解決して、Fusion Order Demoのコード・サンプルを使用する方法の概要を示します。
Javaベクトル・タイプ・パラメータを使用してEJBを使用する手順は、次のとおりです。
図49-23に示すように、Javaコードにベクトルが含まれているとします。
Javaインタフェース・クラスおよびJNDI名に基づいて、EJBバインディング参照を作成します。図49-24に例を示します。
図49-25に示すように、EJB参照をSpringサービス・コンポーネントに接続します。
新しい参照がSpringコンテキスト・ファイルに作成されます。図49-26に詳細を示します。
IExternalPartnerSupplierService
タイプのpublicメンバーを宣言してSpringを有効にし、参照をクラスに挿入します。図49-27に詳細を示します。
メンバーの名前でプロパティをIExternalPartnerSupplierService
に追加し、ExternalPartnerSupplier
参照Beanを参照します。図49-28に詳細を示します。
これによって、ベクトルがEJBパラメータに変換されます。
Oracle Fusion Middlewareでは、JavaクラスをXMLデータにマップするために、Java Architecture for XML Binding(JAXB)およびEclipseLink O/X-Mapper(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
Enterprise JavaBeansをSOAコンポジット・アプリケーションに統合する場合は、JavaクラスをXMLデータにマップすることもできます。詳細は、第36章「Enterprise JavaBeansとSOAコンポジット・アプリケーションの統合」を参照してください。
Oracle SOA Suiteでは、拡張されたマッピング(EXM)ファイルを使用することにより、JAXBおよびOXMファイルのサポートが拡張されています。EXMファイルが設計時プロジェクトのクラスパス内に存在する場合は、そのファイルをJavaからWSDLへの変換に使用できます。EXMファイルには、次の場合のデータ・バインディング・メタデータが用意されています。
JAXB注釈をJavaソースに追加できず、個別に指定する必要がある場合
シナリオがJAXBの対象外である場合(例: メソッドなど最上位レベル要素がタイプまたはパラメータ・タイプを戻す場合)
外部JAXB注釈は、EXMファイルに直接指定するか、またはEXMファイルから参照可能な個別のTopLink JAXBマッピングOXMファイルに含めることができます。
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ファイルは、対応する同じディレクトリ構造内に引き続き存在する必要があります。
例49-12および例49-13に、EXMファイルの例を示します。
例49-12 EXMサンプル・ファイル
<java-web-service-endpoint 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="weblogic.wsee.databinding.internal.test.toplink" file-path="./person-oxm.xml"/> </xml-schema-mapping> <!-- <web-service name="hello-ws" target-namespace="hello-ns"/> <java-methods> <java-method name="hello" oxm:xml-mixed="false"> <oxm:xml-elements> <oxm:xml-element type="java.lang.Integer"/> </oxm:xml-elements> <web-result name="result"/> <java-params> <java-param oxm:xml-mixed="false"> <oxm:xml-elements> <oxm:xml-element type="java.lang.String"/> </oxm:xml-elements> <web-param name="request"/> </java-param> </java-params> </java-method> </java-methods> --> </java-web-service-endpoint>
例49-13 EXMサンプル・ファイル
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <java-wsdl-mapping name="weblogic.wsee.databinding.internal.test.toplink.CollectionMapExtTypeArg" xmlns="http://xmlns.oracle.com/weblogic/weblogic-wsee-databinding" xmlns:oxm="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" databinding="toplink.jaxb"> <soap-binding parameter-style="BARE"/> <java-methods> <java-method name="testListOfCustomer"> <java-params> <java-param> <oxm:xml-element type="weblogic.wsee.databinding.internal.test.toplink.Customer"/> </java-param> </java-params> </java-method> <!-- Not implemented by EclipseLink yet <java-method name="testMapOfCustomer"> <java-params> <java-param> <oxm:xml-element xmlns='http://www.eclipse.org/eclipselink/xsds/persistence/oxm'> <xml-map> <key type='java.lang.String'/> <value type='weblogic.wsee.databinding.internal.test.toplink.Customer'/> </xml-map> </oxm:xml-element> </java-param> </java-params> </java-method> --> <java-method name="testMapOfCustomerAdapters"> <oxm:xml-element xmlns='http://www.eclipse.org/eclipselink/xsds/persistence/oxm'> <oxm:xml-java-type-adapter value='weblogic.wsee.databinding.internal.test.toplink.MapStringIntegerAdapter'/> </oxm:xml-element> <java-params> <java-param> <oxm:xml-element xmlns='http://www.eclipse.org/eclipselink/xsds/persistence/oxm'> <oxm:xml-java-type-adapter value='weblogic.wsee.databinding.internal.test.toplink.MapStringCustomerAdapter'/> </oxm:xml-element> </java-param> </java-params> </java-method> <!-- Not implemented: Bare Multi-part --> <java-method name="test3Lists"> <web-method exclude="true"/> </java-method> </java-methods> </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