![]() ![]() ![]() ![]() |
以下の節では、Spring Framework ベースの WebLogic Server アプリケーションの開発および管理について説明します。状況によっては、MedRec-Spring を作成する視点から説明する場合もあります。
このリリースの WebLogic Server および SpringSource の Spring Framework がどのようにサポートされるかについては、「Spring Framework の使用時にサポートされる製品コンフィグレーション」を参照してください。
WebLogic Server のエンタープライズ機能を Spring で利用する方法を例示するために、Oracle では Avitek Medical Records サンプル アプリケーション (MedRec) を再設計し、コア J2EE コンポーネントを Spring コンポーネントに置き換えました。
以下の節では、MedRec の再設計時に行われた主な手順について説明します。この情報は、独自の J2EE ベースの WebLogic Server アプリケーションを再設計して Spring コンポーネントを使用する場合に利用できます。また、Spring コンポーネントに基づいた WebLogic Server 用のアプリケーションを新規に作成する場合もこの情報を利用できます。
ここでは、読者が J2EE の概念、WebLogic Server、および Spring Framework に精通していることを前提としています。WebLogic Server については、WebLogic Server ドキュメントを参照してください。Spring Framework の一般的な情報については、http://www.springframework.org/ を参照してください。
J2EE ベースのアプリケーションを Spring ベースのアプリケーションに変換するには、必要に応じて次の手順を実行します。
以下の節では、J2EE ベースのアプリケーションを Spring ベースのアプリケーションに再設計する手順を詳細に説明しています。必要な場合は、以下の節にサンプル コードを示します。多くの場合、サンプル コードは MedRec-Spring から取得されています。
Spring では、他の Bean への参照 (注入されるプロパティ) は、Spring のコンフィグレーション XML ファイル applicationContext-web.xml
でコンフィグレーションされます。
MedRec-Spring では、次に示すように、Spring コンフィグレーション ファイル src\medrecEar\web\WEB-INF\applicationContext-web.xml
のステートレス セッション EJB が POJO に置き換えられました。
class="com.bea.medrec.web.patient.actions.ViewRecordAction">
<property name="medRecClientServiceFacade">
<ref bean="medRecClientServiceFacade"/>
</bean>
また、アプリケーション コードで、対応する Bean のセッター メソッドが定義されています。次に例を示します。
protected MedRecClientServiceFacade medRecClientServiceFacade;
public void setMedRecClientServiceFacade(
MedRecClientServiceFacade pMedRecClientServiceFacade){
this.medRecClientServiceFacade = pMedRecClientServiceFacade;
}
Web サービスのプロキシを生成する Spring の JAX-RPC ファクトリを使用するには、次に示すようなコードを実装して Spring JaxRpcPortProxyFactoryBean
をコンフィグレーションします。MedRec-Spring では、このコードが Spring のコンフィグレーション ファイル src\physicianEar\APP-INF\classes\applicationContext-phys-service.xml
に実装されました。
<!-- 新しい医療記録を medrec に送信するための信頼性のある非同期 Web サービス -->
<bean id="reliableClientWebServicesPortType"
class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"
lazy-init="true">
<property name="wsdlDocumentUrl" value="http://${WS_HOST}:${WS_PORT}/ws_phys/PhysicianWebServices?WSDL"/>
<property name="portName" value="PhysicianWebServicesPort"/>
<property name="jaxRpcService">
<ref bean="generatedReliableService"/>
</property>
<property name="serviceInterface" value="com.bea.physician.webservices.client.PhysicianWebServicesPortType"/>
<property name="username" value="medrec_webservice_user"/>
<property name="password" value="weblogic"/>
<property name="customProperties"><props>
<prop key="weblogic.wsee.complex">true</prop>
</props>
</property>
</bean>
<> <!-- 型マッピングでのロードを行うコンストラクタを jaxRpcService クラスで実行できるようにする -->
<bean id="generatedReliableService" class="com.bea.physician.webservices.client.PhysicianWebServices_Impl">
</bean>
Spring では、JMS サービスが実行時にアプリケーションに提供されるようにコンフィグレーションする必要があります。これは、メッセージングの送り先を表す Spring Bean を介して行います。MedRec-Spring では、Spring コンフィグレーション ファイル src\medrecEar\APP-INF\classes\applicationContext-jms.xml
に次のコードが実装され、実行時にアプリケーションで JMS サービスが利用できるようになりました。
<bean id="uploadQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"
value="com.bea.medrec.messagging.MedicalRecordUploadQueue"/>
</bean>
<bean id="jmsConnFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"
value="com.bea.medrec.messagging.MedRecQueueConnectionFactory"/>
</bean>
<bean id="uploadJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref bean="jmsConnFactory"/>
</property>
<property name="defaultDestination">
<ref bean="uploadQueue"/>
</property>
</bean>
WebLogic Server の MBean サーバを Spring の MBeanServerConnectionFactoryBean
を介して Spring に公開することができます。この Bean は、アプリケーションのデプロイメント時に確立およびキャッシュされ、後で Bean を参照することによって操作できる MBeanServerConnection
を生成する便利なファクトリです。この MBeanServerConnectionFactoryBean
をコンフィグレーションして WebLogic Server 実行時 MBean サーバを返し、WebLogic Server ドメイン実行時 MBean サーバおよび WebLogic Server 編集 MBean サーバへの接続を取得することができます。
注意 : | WebLogic Server ドメイン実行時 MBean サーバはデプロイメント時はアクティブでないため、MBeanServerConnectionFactoryBean をコンフィグレーションして Spring の遅延初期化を使用する必要があります。遅延初期化は、呼び出された場合に Spring Bean をフェッチします。 |
WebLogic Server 実行時 MBean サーバ接続を Spring に公開する例を、次のサンプル コードに示します。このコードは、MedRec-Spring において、Spring のコンフィグレーション ファイル medrecEar/APP-INF/classes/applicationContext-jmx.xml
に実装されています。
<> <!-- WebLogic Server の実行時 MBean サーバ接続を公開する -->
<bean id="runtimeMbeanServerConnection" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean">
<property name="serviceUrl" value="service:jmx:t3://${WS_HOST}:${WS_PORT}/jndi/weblogic.management.mbeanservers.runtime"/>
<property name="environment">
<props>
<prop key="java.naming.security.principal">${WS_USERNAME}</prop>
<prop key="java.naming.security.credentials">${WS_USERNAME}</prop>
<prop key="jmx.remote.protocol.provider.pkgs">weblogic.management.remote</prop>
</props>
</property>
</bean>
MedRec-Spring では、WebLogic Server によって管理される JDBC 接続プールを参照するデータソースが使用され、Spring の JdbcDaoSupport
クラスが採用されました。JdbcDaoSupport
については、Spring の関連ドキュメントを参照してください。
JDBC の実装方法の例については、MedRec-Spring クラスを参照してください。
src\medrecEar\dao\com\bea\medrec\dao\jdbc\JdbcPatientDao.java
次のサンプル コードも参照してください。これらのコードは、MecRec-Spring において、Spring コンフィグレーション ファイル src\medrecEar\APP-INF\classes\applicationContext-db.xml
および src\medrecEar\APP-INF\classes\applicationContext-jdbc.xml
にそれぞれ実装されています。
applicationContext-db.xml
サンプル コード :
<!-- データソース プール -->
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/MedRecGlobalDataSourceXA"/>
</bean>
applicationContext-jdbc.xml
サンプル コード :
<bean id="patientDao"
class="com.bea.medrec.dao.jdbc.JdbcPointBasePatientDao"
autowire="byType"/>
さらに、MedRec-Spring では、エンティティ EJB が POJO に置換され、永続性のために Spring JDBC が使用されました。例については、MedRec-Spring クラス \src\medrecEar\core\com\bea\medrec\domain\Address.java
を参照してください。
Spring では、WebLogic Server の JTA 実装を介した分散トランザクションがサポートされています。Spring トランザクション マネージャをコンフィグレーションすると、WebLogic Server JTA トランザクション マネージャに担当タスクを委託することもできます。これは、Spring の WebLogicJtaTransactionManager
クラスを使用して行います。オリジナル バージョンの MedRec のトランザクション管理を完全に反映するため、MedRec-Spring でこのアプローチが使用されました。
トランザクション管理用に Spring トランザクション抽象化レイヤを使用し、担当タスクを WebLogic Server JTA トランザクション マネージャに委託するには、次のようなコードを実装します。これらのコードは、Spring コンフィグレーション ファイル src\medrecEar\APP-INF\classes\applicationContext-tx.xml
および src\medrecEar\APP-INF\classes\applicationContext-service.xml
にそれぞれ実装されています。
applicationContext-tx.xml
サンプル コード :
<!-- Spring のトランザクション マネージャが WebLogic Server のトランザクション マネージャに担当タスクを委託する -->
<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">
<property name="transactionManagerName"
value="javax.transaction.TransactionManager"/>
</bean>
applicationContext-service.xml
サンプル コード :
<!-- medrec Spring Bean が継承するベース トランザクション プロキシ -->
< bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="activate*">PROPAGATION_REQUIRED</prop>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="compose*">PROPAGATION_REQUIRED</prop>
<prop key="deny*">PROPAGATION_REQUIRED</prop>
<prop key="getRecord*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="getPatient*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="getLog*">PROPAGATION_NOT_SUPPORTED</prop>
<prop key="process*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="send*">PROPAGATION_REQUIRED</prop>
</props>
</property>
< /bean>
<!-- すべての medrec クライアント用のサービスのシングル ポイント -->
<bean id="medRecClientServiceFacade"
parent="baseTransactionProxy">
<property name="target">
<bean class="com.bea.medrec.service.MedRecClientServiceFacadeImpl">
<property name="adminService">
<ref bean="adminService"/>
</property>
<property name="patientService">
<ref bean="patientService"/>
</property>
<property name="recordService">
<ref bean="recordService"/>
</property>
<property name="recordXmlProcessorService">
<ref bean="recordXmlProcessorService"/>
</property>
</bean>
</property>
</bean>
transactionAttributes
では、Spring がトランザクションを開始および終了する方法が定義されます。MedRec-Spring はトランザクション管理を WebLogic JTA に委託するため、トランザクションの中断およびロールバックなどの管理タスクは、WebLogic のトランザクション マネージャの指定に従って処理されます。
WebLogicJtaTransactionManager
の詳細については、Oracle Technology Network Web サイトを参照してください。
Spring アプリケーションでは、WebLogic Server のクラスタリング機能を活用できます。Spring アプリケーションの多くは Web アプリケーション (.war ファイル) としてパッケージされるため、Spring アプリケーションを WebLogic Server クラスタ内のサーバにデプロイする以外は、WebLogic Server クラスタを活用するために特別なことを行う必要はありません。
WebLogic Server 上の Spring 1.2.8 および 2.0 証明書は、J2EE RMI 実装とのプロキシ処理をサポートするように Spring JndiRmiProxyFactoryBean
およびそれに関連するサービス エクスポータを拡張します。JndiRmiProxyFactoryBean
およびそのエクスポータの拡張機能を使用するには、次の手順に従います。
<bean id="proProxy" class="org.springframework.remoting.rmi.JndiRmiProxyFactoryBean">
<property name="jndiName" value="t3://${serverName}:${rmiPort}/order"/>
</property>
<property name="jndiEnvironment">
<props>
<prop key="java.naming.factory.url.pkgs">weblogic.jndi.factories</prop>
</props>
</property>
<property name="serviceInterface" value="org.springframework.samples.jpetstore.domain.logic.OrderService"/>
</bean>
<bean id="order-pro" class="org.springframework.remoting.rmi.JndiRmiServiceExporter">
<property name="service" ref="petStore"/>
<property name="serviceInterface" value="org.springframework.samples.jpetstore.domain.logic.OrderService"/>
<property name="jndiName" value="order"/>
</bean>
WebLogic Server セキュリティ システムでは、Java EE セキュリティがサポートおよび拡張され、さまざまなセキュリティ データベースまたはセキュリティ ポリシーと統合するようカスタマイズできるセキュリティ プロバイダが豊富に用意されています。
Spring Security Web サイトで説明されているように、Acegi Security は Spring Portfolio のセキュリティ プロジェクト Spring Security になりました。Spring セキュリティ (acegi) は、Spring アプリケーションにセキュリティ
を追加すると同時に、豊富なセキュリティ プロバイダを提供します。
問題は、これら 2 つのセキュリティ フレームワークをどうやって統合するかです。
J2EE と Spring アプリケーションを統合すると、両方のセキュリティ フレームワークを使用した認証は必要なくなり、WLS セキュリティと Spring セキュリティが連携します。WLS セキュリティが、セキュリティ レルムのデフォルトの認証プロバイダで認証を処理し、マッパー クラスを使用して WLS プリンシパルを Spring GrantedAuthority プリンシパルに変換します。ユーザは WLS セキュリティによって認証されると、Spring セキュリティに対して認証されます。したがって、アプリケーション内のオブジェクトを保護する方法を決定できます。一般的なのは、Java EE リソースを Weblogic セキュリティで保護し、Spring リソースを Spring セキュリティで保護する方法です。
Spring Security のリファレンスでも説明されているように、コンテナ アダプタを使用することで、エンド ユーザ アプリケーションをホストするコンテナ (この場合は WebLogic Server) に直接 Acegi Security を統合できます。
コンテナと Acegi Security は、アダプタを介して統合されます。アダプタは、コンテナと互換性のあるユーザ認証プロバイダを提供し、コンテナと互換性のあるユーザ オブジェクトを返す必要があります。
applicationContext-acegi-security.xml は、Spring セキュリティのコンフィグレーション ファイルです。WebLogic Server では、applicationContext-acegi-security.xml 内のフィールドのリストに、WeblogicAuthenticationFilter が追加されています。このフィルタは、マッパーに基づいて WebLogic プリンシパルを Spring GrantedAuthority サブジェクトに変換するために使用します。マッパーは、WeblogicAuthenticationFilter のプロパティとしてコンフィグレーションするもので、作成時に注入されます。
public class MyAuthorityGranter implements AuthorityGranter {
public Set grant(Principal principal) {
Set rtnSet = new HashSet();
if (principal.getName().equals("fred@oracle.com")) {
rtnSet.add("ROLE_SUPERVISOR");
rtnSet.add("IS_AUTHENTICATED_ANONYMOUSLY");
}
return rtnSet;
}
}
In this example, user fred@oracle.com
in the WebLogic domain is mapped to ROLE_SUPERVISOR
and IS_AUTHENTICATED_ANONYMOUSLY
.
applicationContext-acegi-security.xml
ファイルをプラグインするには、web.xml
に次のコードを追加します。
<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/main/secure/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-
class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext-acegi-security.xml
</param-value>
</context-param>
標準の WebLogic Server インストールでは、WebLogic Server Java EE コンテナで、標準の Java EE 5 の依存性注入とインターセプタ (アスペクト指向プログラミングの形式) が提供されます。また、拡張された依存性注入機能とアスペクト指向プログラミングを提供する Spring Framework 拡張機能もサポートされます。この拡張では、JSR-250 (共通アノテーション)、依存性注入、および EJB 3.0 スタイルのインターセプションを提供する Spring Framework アドオン Pitchfork を使用します。この拡張によって、サーブレット リスナやフィルタを含む EJB インスタンスおよび Web コンポーネントに、依存性注入とアスペクト指向プログラミングが提供されます。
注意 : | このリリースの WebLogic Server の JSP タグ ハンドラでは Spring 拡張機能はサポートされません。 |
WebLogic Server で Spring 拡張機能を有効にするには、次の手順に従います。
WebLogic Server Web コンテナおよび EJB コンテナでは、これらの jar を使用してコンテナ サービス (依存性注入とインターセプタ) を提供します。
これらの jar はサーバのクラスパスに追加されているため、アプリケーション (ear、war、または jar ファイルとしてパッケージ化したもの) でも使用されます。アプリケーションと一緒にパッケージ化されている jar を使用するようにアプリケーションをコンフィグレーションするには、特定のデプロイメント記述子を有効にする必要があります。
<component-factory-class-name>
要素を org.springframework.jee.interfaces.SpringComponentFactory
に設定して Spring 拡張機能を有効にします。この要素は、EJB、Web、およびアプリケーション記述子に含まれています。アプリケーション レベルの記述子は、モジュール レベルの記述子によって上書きされます。このタグを null (デフォルト) に設定すると、Spring 拡張機能は無効になります。 spring-ejb-jar.xml
または spring-web.xml
という名前の共通 Spring Bean 定義ファイルを、アプリケーションの /WEB-INF/classes/META-INF ディレクトリ (または jar ファイル内の META-INF ディレクトリ) に配置します。WebLogic コンテナは、これらの名前で標準の Spring Bean 定義ファイルを検索します。Spring コンテナから EJB やサーブレットのインスタンスを認識するには、Spring Bean の <id>
タグを、EJB の場合は ejb-name
に、Web コンポーネントの場合は class-name
に設定する必要があります。
WebLogic Server Administration Console に対する拡張を使用すると、アプリケーション内で定義されている Spring Bean 属性をモニタできます。
Spring コンソール拡張は、WebLogic Server インフラストラクチャを使用して登録する RuntimeMBean をベースとしています。コンソール拡張には、デプロイされている Spring Bean のコンフィグレーション情報が表示されます。
現行リリースの Spring コンソール拡張は、Web アプリケーションには対応していますが EJB には対応していません。
Spring コンソール拡張を使用するには、Spring Bean のサポートをオンにして、Spring コンソール拡張を有効にする必要があります。次にその手順を示します。
WL_HOME/
server/lib/weblogic-spring.jar
を WebLogic Server にデプロイします。WL_HOME
は WebLogic Server のメイン インストール ディレクトリ
(\beahome/wlserver_10.3
など) です。この手順を実行するのは、WebLogic Server インスタンスに対して 1 回のみです。
この jar ファイルは、Java EE のオプション パッケージで、アプリケーション (ear または war ファイルとしてパッケージ化されたもの) をデプロイする際にそのアプリケーション用の MBean を作成するために使用します。
以下のいずれかの方法で weblogic-spring.jar
をデプロイします。
WL_HOME
\server\lib
にあります。 java weblogic.Deployer -library -deploy – source
WL_HOME
/server/lib/weblogic-spring.jar – targets
server_name
-adminurl
server_URL
-user
user_name
-password
password
weblogic-spring.jar
を含めます。この手順は、Spring 実行時 MBean または Spring コンソール拡張を使用するすべての Spring アプリケーションで個別に実行する必要があります。
具体的には、META-INF/Manifest.mf
に以下の行を追加します。
Extension-List: WeblogicSpring
WeblogicSpring-Extension-Name: weblogic-spring
WeblogicSpring-Specification-Version: 10.3.0.0
WeblogicSpring-Implementation-Version: 10.3.0.0
weblogic-spring.jar
から WeblogicSpringApplicationListener を追加する必要があります。これは、以下の 2 つの方法で行うことができます。可能であれば 1 番目の方法をお勧めします。 web.xml
を編集し、Spring コンテキスト ローダー リスナを WebLogic コンテキスト ローダー リスナに変更します。つまり、<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
<listener-class>
weblogic.spring.monitoring.WeblogicContextLoaderListener
</listener-class>
WeblogicContextLoaderListener は、Spring ContextLoaderListener を拡張し、WeblogicSpringApplicationListener を ApplicationListener および BeanFactoryPostProcessor として Web アプリケーション コンテキストに追加します。
Web アプリケーションの Spring XML コンフィグレーション ファイルに次の行を追加します。
<bean class="weblogic.spring.monitoring.WeblogicSpringApplicationListener " />
MBean ではない Spring Bean に WebLogic Administration Console を介してアクセスするには、applicationContext.xml
ファイルの MBeanExporter をコンフィグレーションしてアセンブラを介して公開する Bean を指定する必要があります。applicationName
プロパティがアプリケーションのデプロイメント名であることを確認してください。
![]() ![]() ![]() |