Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将jndi数据源与spring批处理管理一起使用_Spring_Spring Batch_Spring Batch Admin - Fatal编程技术网

将jndi数据源与spring批处理管理一起使用

将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

当使用SpringBatch管理时,它尝试为dataSource、transactionManager等提供一些默认值

如果要覆盖这些默认值,可以在META-INF/spring/batch/servlet/override/文件夹下创建自己的xml bean定义,并在引导过程中保证覆盖默认属性

在spring batch admin中,使用此定义在data-source-context.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>
<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
servlet-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文件夹中?我必须按照这个线程将上下文移动到主文件夹。