关于spring的xml配置文件中读取${username}为系统当前用户名的问题

项目场景:

项目场景:在自学spring ioc使用JdbcTemplate+Druid连接池中出现了连接不上数据库的问题,原因是数据库的用户名被识别为了系统的用户名。


问题描述

配置spring的xml配置文件读取druid的properties配置文件时,其他参数都能正确识别,唯独username会识别为当前系统的用户名

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!-- 读取外部.properties配置文件  => 设置properties标签,其中value = "${key}"
    <context:property-placeholder location="classpath:druid.properties",classpath:其他配置,可以添加多个properties配置文件/>
-->
    <context:property-placeholder location="classpath:druid.properties"/>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${url}"/>
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>
# druid.properties
url = jdbc:mysql://localhost:3306/studb
username = user
password = xxxx
driverClassName = com.mysql.cj.jdbc.Driver
initialSize = 5
maxActive = 20

在这里插入图片描述


原因分析:

既然username被识别为了系统的用户名,说明spring读取了系统变量的USERNAME
在cmd中输入set查看环境变量
在这里插入图片描述

查阅资料发现,spring默认会优先加载系统环境变量,此时获取到的username的值实际上指的是当前计算机的用户名。而不是properties配置文件中指定的username的值。


解决方案:

方案一:修改配置文件,不要使用与环境变量相同的key,比如把username改为db.username

# druid.properties
url = jdbc:mysql://localhost:3306/studb
db.username = user
password = xxxx
driverClassName = com.mysql.cj.jdbc.Driver
initialSize = 5
maxActive = 20
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!-- 读取外部.properties配置文件  => 设置properties标签,其中value = "${key}"
    <context:property-placeholder location="classpath:druid.properties",classpath:其他配置,可以添加多个properties配置文件/>
-->
    <context:property-placeholder location="classpath:druid.properties"/>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${url}"/>
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${password}"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

方案二:修改spring的xml配置文件,设置local-override=“true”,覆盖重名的环境变量

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!-- 读取外部.properties配置文件  => 设置properties标签,其中value = "${key}"
    <context:property-placeholder location="classpath:druid.properties",classpath:其他配置,可以添加多个properties配置文件/>
-->
<!--  设置local-override="true",覆盖重名的环境变量,否则username撞系统变量了  -->
    <context:property-placeholder local-override="true" location="classpath:druid.properties"/>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${url}"/>
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot,可以使用Jackson XML库来读取XML配置文件的JSON数据,并使用Spring Data JDBC来连接数据库。 首先,需要在项目的pom.xml文件添加以下依赖: ```xml <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.12.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ``` 接下来,在application.properties或application.yml文件配置数据库连接信息: ```yml spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root ``` 然后,在读取XML配置文件的JSON文件时,可以使用以下代码: ```java @Autowired private ResourceLoader resourceLoader; public void readJsonFromXml() throws IOException { Resource resource = resourceLoader.getResource("classpath:config.xml"); XmlMapper xmlMapper = new XmlMapper(); JsonNode jsonNode = xmlMapper.readValue(resource.getFile(), JsonNode.class); String url = jsonNode.get("database").get("url").asText(); String username = jsonNode.get("database").get("username").asText(); String password = jsonNode.get("database").get("password").asText(); // 使用JDBC连接数据库 } ``` 其,config.xml文件的内容如下: ```xml <config> <database> <url>{"url":"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"}</url> <username>{"username":"root"}</username> <password>{"password":"root"}</password> </database> </config> ``` 通过以上步骤,就可以通过读取XML配置文件的JSON文件来连接数据库了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rookie_gzzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值