7

Spring Batch Admin を使用する場合、dataSource、transactionManager などにいくつかのデフォルトを提供しようとします。

これらのデフォルトをオーバーライドする場合は、独自の xml Bean 定義をMETA-INF/spring/batch/servlet/override/フォルダーの下に作成し、ブートストラップ中にデフォルト プロパティがオーバーライドされることを保証します。

spring-batch-admin では、この定義で data-source-context.xml に dataSource のデフォルトが定義されています。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${batch.jdbc.driver}" />
    <property name="url" value="${batch.jdbc.url}" />
    <property name="username" value="${batch.jdbc.user}" />
    <property name="password" value="${batch.jdbc.password}" />
    <property name="testWhileIdle" value="${batch.jdbc.testWhileIdle}"/>
    <property name="validationQuery" value="${batch.jdbc.validationQuery}"/>
</bean>

ここで、この dataSource を JNDI データソースでオーバーライドしたいので、 のようなプロパティ行を削除しbatch.jdbc.driverbatch.jdbc.url次の jndi 定義を持っています

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
     <property name="jndiName" value="java:comp/env/jdbc/dbconn" />
</bean> 

ご想像のとおり、システムは最初に data-source-context.xml で定義された dataSource Bean を初期化しようとしますが、プロパティ値 batch.jdbc.* の値が見つからないため、例外で失敗します。

文字列値 [${batch.jdbc.driver}] のプレースホルダー 'batch.jdbc.driver' を解決できませんでした

私は JNDI を使用する予定で、これらのプロパティ値を処理したくないため、続行できません。

この状況で dataSource をオーバーライドする方法について何か考えはありますか?

4

2 に答える 2

3

Spring 3.1以降、現在の環境に基づいてデータソースの「ソース」を設定できる「プロファイル」機能があります(ローカルテスト用の組み込みのもの、展開用のJNDIのもの)。

これは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- "production" datasource -->
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/dbconn"/>

    <!-- profile for "local" testing -->
    <beans profile="local">
            <!-- datasource that only gets created in that active profile -->
        <jdbc:embedded-database id="dataSource" type="H2"/>
    </beans>


</beans>

この例では、「アクティブなプロファイル」が「ローカル」に設定されている場合、jndi-lookup データソースが上書きされます。

于 2013-04-18T10:52:47.497 に答える