java - 在 spring applicationContext.xml 中访问系统属性时出错
问题描述
我想将我的 db 文件位置设置为系统变量的一部分,该变量应在启动应用程序时提供。我想访问applicationContext.xml
我尝试使用#{systemProperties['db.properties']}
的这个系统属性applicationContext.xml.
我以以下两种方式定义了 propertyPlaceholderConfigurer bean,以两种不同的方式为属性“位置”指定值:
情况1 #:
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true"/>
<property name="locations">
<value>file://"#{systemProperties['db.properties']}"</value>
</property>
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
数据源 bean #:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.user}"/>
<property name="password" value="${db.pwd}"/>
</bean>
案例2#:
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true"/>
<property name="locations">
<value>file://${DB_CONF}/test/db.properties</value>
</property>
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
如果我在案例 2 中使用属性位置的值而不是 "#{systemProperties['db.properties']}" 应用程序可以正常工作。在案例 1 中,我尝试从与系统属性相同的位置访问相同的属性文件,但应用程序无法正常工作,错误如下:
堆栈跟踪
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:235)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171)
at org.hibernate.internal.SessionImpl.connection(SessionImpl.java:450)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:450)
... 133 more
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'org.postgresql.Driver' for connect URL '${db.url}'
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139)
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228)
... 136 more
Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:315)
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
解决方案
我可以解决错误。罪魁祸首是双引号。使用 file://#{systemProperties['db.properties']} 而不是 file://"#{systemProperties['db.properties']}" 解决了这个问题。
推荐阅读
- c++ - 负零整数
- css - 格式化日期反应
- azure - 我有一个 API 部署到 Azure VM。我想将此 API 的所有控制台输出发送到一些云文本存储以供阅读我该怎么做?
- wordpress - 密码保护页面在更改密码后不接受有效密码
- node.js - node.js:回调后返回布尔值
- amazon-connect - 如何在 Amazon Connect 中删除联系流?
- python - 使用 SCHACL 验证 xsd:dateTime
- java - 将字符串解析为 ZonedDatetime,包括时间偏移 Java 8
- r - 使用 R 将列拆分为 3 列
- docker - docker compose exec 更改我的参数值