spring - MyBatis - 数据库连接失败,因为 PropertyPlacholderConfigurer 不解析占位符引用
问题描述
我是 MyBatis 的新手,我遇到了一个测试类无法连接到数据库的问题,因为属性占位符没有得到解决。只要我用${placeholder}
硬编码字符串替换设置,它就可以正常工作。
我已经搜索了很多,发现像这样的线程context:property-placeholder doesn't resolve references。不幸的是,将sqlSessionFactoryBeanName
属性添加到MapperScannerConfigurer
没有效果。无论我尝试了什么,测试类仅在我对连接设置进行硬编码时才有效。
谁能帮我找出我做错了什么......虽然我还有一些头发?如果您需要更多信息,请询问。
相关版本:
- 弹簧框架4.3
- mybatis 3.5.0版本
- mybatis-spring 1.3.2版
- dbcp 版本 2.6
这是我的最新尝试(抱歉代码混乱)
myproperties.properties
driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin@//host:port/someservicename
username=someusername
password=somepassword
应用程序上下文.xml
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlacholderConfigurer">
<property name="locations">
<list>
<value>classpath:myproperties.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.abc.model"/>
<property name="mapperLocations" value="classpath*:MyMapper.xml"/>
</bean>
<bean id="transactionManager"
class="org.springframeword.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="com.abc.mappers"
p:sqlSessionFactoryBeanName="sqlSessionFactory"
p:processPropertyPlaceholders="true" />
mybatis-config.xml
<configuration>
<typeAliases>
<typeAlias ..../>
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="/path/to/MyMapper.xml"/>
</mappers>
</configuration>
测试类无法连接,出现这样的错误
###
查询数据库时出错。原因 org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; 嵌套异常是 java.sql.SQLException: Cannot create PoolableConnectionFactory (IO Error: The Netword Adapter 无法建立连接)
解决方案
从未失败。花几个小时在一个问题上,你一发布问题就会找到答案。
原来占位符未解析的原因是属性名称意外重复,位于底部myproperties.properties
:
driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin@//host:port/someservicename
username=someusername
password=somepassword
...
...
#duplicated property names
driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin@//host:port/someservicename
username=someusername
password=somepassword
一旦我删除了重复项,占位符就解决了。希望这个愚蠢的错误会帮助别人。
推荐阅读
- javascript - 数组过滤器在 Reactjs 中返回一个空数组
- javascript - 使用 selenium 在 javascript 中解析数据
- node.js - Node Docker 构建和生产容器最佳实践
- google-cloud-platform - 来自 androidpublisher API 的奇怪的 500 错误响应,对解决它没有任何帮助,
- java - 如何将 JPA 关系添加到持久实体的属性子集列表中?
- javascript - 当作为参数传递时,构造函数中绑定的 React 方法如何失去它的有界性?
- android - 从 Firebase 存储中检索图像 url 并放置在警报对话框中
- c++ - 切换到 Visual Studio 2019 后必须在此上下文中展开参数包
- safari - getAccessTokenAsync 仅在 safari 上返回 13001
- javascript - 将函数放入 javascript 对象中是一种好习惯吗?