Использование источника данных jndi с администратором spring batch

при использовании Spring Batch Admin он пытается предоставить некоторые значения по умолчанию для dataSource, transactionManager и т. д.

если вы хотите переопределить эти значения по умолчанию, вы создаете свои собственные определения XML-компонентов в разделе META-INF / spring / batch / servlet/override/ папка и во время начальной загрузки гарантирует, что свойства по умолчанию будут переопределены.

в spring-batch-admin Источник данных по умолчанию определяется в контексте источника данных.xml с этим определение

<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>

теперь я хочу переопределить этот источник данных с источником данных JNDI, поэтому я удалил строки свойств, такие как batch.jdbc.driver, batch.jdbc.url и имеют следующее определение jndi

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

как вы можете легко догадаться, система сначала пытается инициализировать компонент источника данных, определенный в контексте источника данных.xml и поскольку он не может найти значения для пакета значений свойств.интерфейс jdbc.* он выдает исключение.

не удалось разрешить заполнитель - партия.интерфейс jdbc.драйвер " в строковом значении [${batch.интерфейс jdbc.driver}]

поскольку я буду использовать JNDI и не хочу иметь дело с этими значениями свойств, я не могу продолжить.

любые идеи о том, как переопределить источник данных в этой ситуации?

2 ответов


в Spring Batch Admin есть 2 Spring ApplicationContexts, которые загружаются:

  • сервлет-конфигурации.в XML
  • webapp-config.в XML

сервлет-конфигурации.xml имеет следующие импорта:

<import resource="classpath*:/META-INF/spring/batch/servlet/resources/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/servlet/manager/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/servlet/override/*.xml" />

webapp-config.xml имеет следующие импорта:

<import resource="classpath*:/META-INF/spring/batch/bootstrap/**/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/override/**/*.xml" />

сервлет-конфигурации.в XML configurers сервлета веб-приложения-конфигурация.xml настраивает (бэкэнд-часть) приложения. Проблема в том, что компонент dataSource является частью of / defined во второй конфигурации, а не в первой. Следовательно, при добавлении компонента источника данных в переопределение для конфигурации сервлета (/META-INF/spring/batch/servlet/override/*.xml), как вы это делаете, вы добавляете новый компонент в первый контекст вместо перезаписи компонента источника данных второго контекста.

Итак, вам нужно поместить свой пользовательский контекст источника данных.xml под META-INF / spring / batch / override / вместо META-INF / spring / batch / servlet / override/

тогда он работает, и вы даже не получите Could not resolve placeholder 'batch.jdbc.driver' in string value [${batch.jdbc.driver}] ошибка.


С весны 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.