当前位置: 首页 > 知识库问答 >
问题:

在spring batch admin中使用jndi数据源

淳于亦
2023-03-14

当使用Spring Batch Admin时,它会尝试为dataSource、transactionManager等提供一些默认值。

如果您想覆盖这些默认值,您可以在META-INF/Spring/批/servlet/overder/文件夹下创建自己的xml bean定义,并且在引导期间它保证将覆盖默认属性。

在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.driverbatch.jdbc.url这样的属性行,并具有以下jndi定义

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

您可能很容易猜到,系统首先尝试初始化在数据源上下文中定义的数据源bean。xml,因为它找不到属性值的任何值。jdbc。*它失败了,只有一个例外。

无法解析字符串值中的占位符“batch.jdbc.driver”[${batch.jdbc.driver}]

因为我将使用JNDI,不想处理这些属性值,所以我无法继续。

你知道在这种情况下如何覆盖数据源吗?

共有2个答案

郜谦
2023-03-14

从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查找数据源。

乜裕
2023-03-14

在Spring Batch Admin中,有2个Spring Application Context正在加载:

  • 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" />

webapp-config.xml有这些进口:

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

servlet配置。xml配置servlet、webapp config。xml配置(应用程序的后端部分)。问题在于,数据源bean是第二个配置的一部分,而不是第一个配置中定义的。因此,当您将数据源bean添加到servlet配置的覆盖(/META-INF/spring/batch/servlet/override/*.xml)时,您将向第一个上下文添加一个新bean,而不是覆盖第二个上下文的数据源bean。

因此,需要将自定义数据源置于上下文中。META-INF/spring/batch/override/下的xml,而不是META-INF/spring/batch/servlet/override/

然后它工作,你甚至不会得到无法解析占位符的批处理。jdbc。字符串值[${batch.jdbc.driver}]中的“驱动程序”错误。

 类似资料:
  • 在其他错误中,我发现了以下错误: 错误[org.jboss.as.Controller.management-Operation](控制器引导线程)JBAS014613:操作(“add”)失败-地址:([(“subsystem”=>“datasources”),(“data-source”=>“mydatasource”)])-失败描述:{“JBAS014771:Services with mis

  • 问题内容: 我正在尝试设置一些jUnit测试。我们的数据库由服务器使用JNDI连接。我们在root.xml中有一个描述设置的xml。如何设置jUnit以连接数据库?我希望它只是从root.xml中读取内容,但是无论如何我都愿意进行设置。 问题答案: 我发现最好的方法是使用称为Simple- Jndi的 东西。 我将此添加到Maven文件中: 您可以在此处下载软件包,下载内容包含说明手册。 http

  • 我在使用Spring ApplicationContext.xml文件中的JNDI配置dataSource bean时遇到了困难。 我的applicationContext.xml条目如下所示: 通过这些配置,我在Tomcat控制台上不断得到这样的错误: 由:javax.naming.NameNotFoundException:Name[jdbc/myapp]在此上下文中没有绑定。找不到[jdbc

  • 问题内容: 我有hibernate通过JNDI数据源连接到数据库。 我的目的:使用JNDI注册数据源以测试DAO层。 例 hibernate配置 在测试类中获取SessionFactory: 作为结果: 要注册JNOI,我使用示例(http://www.roseindia.net/tutorial/java/jdbc/registeringthedatasourcewithjndi.html) 请

  • 我试图创建一个Spring Boot应用程序,它连接两个数据源。我可以通过遵循Spring文档来实现这一点,但我面临的挑战是实现以下目标 null 是否有任何方法可以使用Spring Boot的自动配置功能来实现这一点,或者我必须基于概要文件创建不同的数据源bean。

  • 问题内容: 在有关类的Spring javadoc文章中,该类非常简单,建议使用 使用容器提供的JNDI数据源。这样DataSource可以通过DataSourceSpring ApplicationContext中的bean 形式公开。 问题是:我该如何完成? 例如,如果我希望让访问我的自定义MySQL数据库,那我需要什么?我应该在上下文配置等中写些什么? 问题答案: 如果使用基于Spring