将jndi数据源与spring批处理管理一起使用
当使用SpringBatch管理时,它尝试为dataSource、transactionManager等提供一些默认值 如果要覆盖这些默认值,可以在META-INF/spring/batch/servlet/override/文件夹下创建自己的xml bean定义,并在引导过程中保证覆盖默认属性 在spring batch admin中,使用此定义在data-source-context.xml中定义了数据源默认值将jndi数据源与spring批处理管理一起使用,spring,spring-batch,spring-batch-admin,Spring,Spring Batch,Spring Batch Admin,当使用SpringBatch管理时,它尝试为dataSource、transactionManager等提供一些默认值 如果要覆盖这些默认值,可以在META-INF/spring/batch/servlet/override/文件夹下创建自己的xml bean定义,并在引导过程中保证覆盖默认属性 在spring batch admin中,使用此定义在data-source-context.xml中定义了数据源默认值 <bean id="dataSource" class="org.apac
<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>
<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,不想处理这些属性值,所以无法继续
您知道如何在这种情况下覆盖数据源吗?自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查找数据源。在Spring Batch Admin中,有两个Spring应用程序上下文正在加载:
- servlet-config.xml
- webapp-config.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" />
<import resource="classpath*:/META-INF/spring/batch/bootstrap/**/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/override/**/*.xml" />
webapp-config.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" />
<import resource="classpath*:/META-INF/spring/batch/bootstrap/**/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/override/**/*.xml" />
servlet-config.xml配置servlet,webapp-config.xml配置(应用程序的后端部分)。
问题是数据源bean是第二个配置的一部分,而不是第一个配置中定义的。
因此,当您将数据源bean添加到servlet配置的覆盖(/META-INF/spring/batch/servlet/override/*.xml)时,您将向第一个上下文添加一个新bean,而不是覆盖第二个上下文的数据源bean
因此,您需要将自定义的data-source-context.xml放在META-INF/spring/batch/override/下,而不是META-INF/spring/batch/servlet/override/
然后它工作,您甚至不会得到
无法解析字符串值[${batch.jdbc.driver}]中占位符“batch.jdbc.driver”
错误。您好-找到解决方案了吗?(我不想只为这个问题使用配置文件。)@sdny否。也尝试使用没有配置文件的解决方案。我遇到过同样的问题。即使使用所需的属性设置工作“默认”连接,我无法获取要使用的覆盖数据源。您需要将自定义的data-source-context.xml放在META-INF/spring/batch/override/下,而不是META-INF/spring/batch/servlet/override/下,您可以将添加到META-INF/spring/batch/override/的上下文文件的内容发布吗?我将env-context.xml复制到了/batch/override/manager/env-context.xml并将classpath:batch-${ENVIRONMENT:hsql}.properties更改为classpath:batch-mysql.properties,但它不起作用。您能否确认是否已将其添加到maven项目的main或webapps文件夹中?我必须按照这个线程将上下文移动到主文件夹。