ヘッダーをスキップ
Oracle® Fusion Middleware WebLogic Server での Spring のサポート
11g リリース 1 (10.3.1)
B55577-01
  目次
目次

戻る
戻る
 
 

7 Spring ベースの Oracle Weblogic Server アプリケーションの開発

MedRec (Spring バージョン) というサンプル アプリケーションは、WebLogic Server に含まれ、MedRec-Spring と呼ばれます。サンプル アプリケーションは、WebLogic Server J2EE ベースの Avitek Medical Records サンプル アプリケーション (MedRec) に基づきます。以下の節で説明するように、MedRec-Spring では、J2EE ベースの Medrec コンポーネントは Spring コンポーネントに置き換えられます。

  1. Spring の制御の反転のコンフィグレーション

  2. Spring の Web サービス クライアント サービスの有効化。Spring では、Web サービスのプロキシを生成する JAX-WC ファクトリが提供されます。

  3. JMS サービスを実行時にアプリケーションで利用できるようにする

  4. JPA データ アクセスの使用

  5. トランザクション管理のために Spring トランザクション抽象化レイヤの使用

以降の節に示すサンプル コードは MedRec-Spring からのコードです。


注意 :

WebLogic Server をインストールするときには、MedRec-Spring はデフォルトでインストールされません。カスタム インストールを選択して、[製品およびコンポーネントの選択] ページからの Server Examples を選択します。

すでに、WebLogic Server がインストールされている場合、インストーラを再起動して、WebLogic Server がインストールされている Middleware ホームを選択し、カスタム インストールを選択して、[製品およびコンポーネントの選択] ページからの Server Examples を選択します。

Medrec-Spring とともにそれらの設計と実装に関するドキュメントが含まれています。これらのドキュメントは、WL_HOME\samples\server\docs\ にあります。Windows の [スタート] メニューから以下のオプションを選択してこれは表示することができます。[スタート|プログラム|Oracle WebLogic|WebLogic Server|Examples|マニュアル]


Spring の制御の反転のコンフィグレーション

Spring では、他の bean への参照 (注入されるプロパティ) は、Spring のコンフィグレーション ファイル applicationContext-web.xml でコンフィグレーションされます。

Spring 2.5 アノテーション駆動型コンフィグレーションが MedRec-Spring で使用されます。アプリケーション コンテキストは、Spring によって @Service のような Spring 固有のアノテーションを検出する Spring bean が自動的にスキャンされるように、コンフィグレーションされています。従って、Spring bean は XML コンフィグレーション ファイルに宣言する必要はありません。WL_HOME\samples\server\medrec-spring\modules\medrec\web\war\WEB-INF\applicationContext.xml 内のコンフィグレーションは、以下のとおりです。

<context:component-scan base-package="com.oracle.medrec"/>

主に、依存性注入は @Autowired アノテーションでコンフィグレーションされます。たとえば、WL_HOME\samples\server\medrec-spring\modules\medrec\domain\src\com\oracle\medrec\service\impl\RecordServiceImpl.java の内容は以下のとおりです。

@Service("recordService")
@Transactional
public class RecordServiceImpl implements RecordService {

    @Autowired
    private RecordRepository recordRepository;

    @Autowired
    private PatientRepository patientRepository;

    @Autowired
    private PhysicianRepository physicianRepository;

これらのアノテーションは、EJB 3.0 の開発と同様な開発を提供します。詳細については、http://www.springsource.org/documentation/ にある Spring の関連ドキュメントの「Annotation Type Autowired」を参照してください。

Spring の Web サービス クライアント サービスの有効

WL_HOME\samples\server\medrec-spring\modules\physician\web\war\WEB-INF\applicationContext.xml からの次のサンプルに示すように、MedRec-Spring は、Web Services の動的プロキシを公開するために Spring JaxWsPortProxyFactoryBean を使用します。

<bean id="patientService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
   <property name="serviceInterface" value="com.oracle.physician.service.PatientService"/>
   <property name="wsdlDocumentUrl" 
         value="http://localhost:7011/medrec/webservices/PatientFacadeService?WSDL"/>
   <property name="namespaceUri" value="http://www.oracle.com/medrec"/>
   <property name="serviceName" value="PatientFacadeService"/>
   <property name="portName" value="PatientFacadePort"/>
</bean>

<bean id="physicianService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
   <property name="serviceInterface" value="com.oracle.physician.service.PhysicianService"/>
   <property name="wsdlDocumentUrl"
         value="http://localhost:7011/medrec/webservices/PhysicianFacadeService?WSDL"/>
  <property name="namespaceUri" value="http://www.oracle.com/medrec"/>
  <property name="serviceName" value="PhysicianFacadeService"/>
  <property name="portName" value="PhysicianFacadePort"/>
</bean>

<bean id="recordService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
  <property name="serviceInterface" value="com.oracle.physician.service.RecordService"/>
  <property name="wsdlDocumentUrl"
         value="http://localhost:7011/medrec/webservices/RecordFacadeService?WSDL"/>
  <property name="namespaceUri" value="http://www.oracle.com/medrec"/>
  <property name="serviceName" value="RecordFacadeService"/>
  <property name="portName" value="RecordFacadePort"/>
</bean>

この方法により、ツールで生成された Web サービスのスタブを使用する必要はありません。詳細については、Spring の関連ドキュメント (http://www.springsource.org/documentation/) の「JaxWsPortProxyFactoryBean」を参照してください。

JMS サービスを実行時にアプリケーションで利用できるようにする

Spring では、JMS サービスが実行時にアプリケーションに提供されるようにコンフィグレーションする必要があります。MedRec-Springでは、Oracle は Spring のコンフィグレーション ファイル WL_HOME\samples\server\medrec-spring\modules\medrec\web\war\WEB-INF\applicationContext.xml に次のコードを実装することによって、実行時に JMS サービスがアプリケーションに利用できるようにします。

<!--- メッセージング ************************************* -->
   <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
      <property name="connectionFactory" ref="connectionFactory"/>
   </bean>
   <jee:jndi-lookup id="connectionFactory" jndi-name="weblogic.jms.XAConnectionFactory"/>
        
   <jee:jndi-lookup id="patientNotificationQueue"
      jndi-name="com.oracle.medrec.jms.PatientNotificationQueue"/>
   <bean id="messageListener" 
   class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
      <property name="delegate" ref="patientNotifierBroker"/>
      <property name="defaultListenerMethod" value="notifyPatient"/>
   </bean>

   <bean id="messageListenerContainer"
         class="org.springframework.jms.listener.DefaultMessageListenerContainer">
      <!--<property name="taskExecutor" ref="taskExecutor"/>-->
      <property name="connectionFactory" ref="connectionFactory"/>
      <property name="messageListener" ref="messageListener"/>
      <property name="destination" ref="patientNotificationQueue"/>
      <!-- no need to use XA transaction now -->
      <property name="sessionTransacted" value="true"/>
</bean>

ここで、Spring フレームワークからのさまざまな Bean が宣言されます。特に、jmsTemplate は、基底の JMS API をラップして、メッセージを送信するために使用します。messageListenerContainer は、[メッセージ駆動型 Bean] コンテナと同じ機能を提供し、MedRec-Spring の JMS リスナが登録されます。

JPA データ アクセスの使用

MedRec-Spring は、データ ソースを管理するには、標準 Java Persistence API (JPA) を使用します。コンフィグレーションは WL_HOME\samples\server\medrec-spring\modules\medrec\domain\src\META-INF\persistence.xml にあります。

    <persistence-unit name="MedRec" transaction-type="JTA">
        <jta-data-source>jdbc/MedRecGlobalDataSourceXA</jta-data-source>
        <class>com.oracle.medrec.model.Address</class>
        <class>com.oracle.medrec.model.Administrator</class>
        <class>com.oracle.medrec.model.BaseEntity</class>
        <class>com.oracle.medrec.model.PersonName</class>
        <class>com.oracle.medrec.model.Patient</class>
        <class>com.oracle.medrec.model.Physician</class>
        <class>com.oracle.medrec.model.Prescription</class>
        <class>com.oracle.medrec.model.Record</class>
        <class>com.oracle.medrec.model.RegularUser</class>
        <class>com.oracle.medrec.model.User</class>
        <class>com.oracle.medrec.model.VersionedEntity</class>
        <class>com.oracle.medrec.model.VitalSigns</class>
        <properties>
            <property name="kodo.jdbc.SynchronizeMappings"
                      value="buildSchema"/>
        </properties>
    </persistence-unit>

MedRec-Spring はアノテーション駆動型アプローチ (この場合、すべての DAO のための @Repository) を使用しているため、MedRec-Spring は Spring コンフィグレーション ファイルに Data Access Object (DAO) を宣言しません。よって、これらのすべてが自動的に Spring によって管理されます。たとえば、RecordRepositoryImpl.java を参照してください。

@Repository
public class RecordRepositoryImpl
         extends EntityRepositorySupport<Record, Long> implements RecordRepository {

      public List<Record> findRecordsByPatientId(Long patientId) {
         return findByProperty("Record.findRecordsByPatientId", patientId);
      }
}

トランザクション管理のために Spring トランザクション抽象化レイヤの使用

MedRec-Spring は、WebLogic JTA トランザクション マネージャを使用およびアノテーション ベース宣言型トランザクションの管理を有効するために Spring 2.5 コンフィグレーションを使用します。「WL_HOME\samples\server\medrec-spring\modules\medrec\web\war\WEB-INF\applicationContext.xml」内のコンフィグレーションを参照してください。

   <tx:jta-transaction-manager/>

   <tx:annotation-driven/>

すべてのトランザクションの境界設定が Spring の @Transactional アノテーションによって実装されます。これは、EJB 3.0 アプリケーションで行われる操作と同じです。「WL_HOME\samples\server\medrec-spring\modules\medrec\domain\src\com\oracle\medrec\service\impl\RecordServiceImpl.java」を参照してください。

@Service("recordService")
@Transactional
public class RecordServiceImpl implements RecordService {

…
   public void createRecord(Record record, Long physicianId, Long patientId) {

   }

   @Transactional(readOnly = true)
   public List<Record> getRecordsByPatientId(Long patientId) {
      }

   @Transactional(readOnly = true)
   public Record getRecord(Long id) {
   }
}