gpt4 book ai didi

java - PropertyPlaceholderConfigurer 用于读取属性文件和数据库

转载 作者:行者123 更新时间:2023-12-01 11:54:10 24 4
gpt4 key购买 nike

我正在尝试创建两个PropertyPlaceholderConfigurer,一个用于访问属性文件,另一个用于访问数据库...代码如下

  <bean id="otherPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="properties">
<bean class="org.apache.commons.configuration.ConfigurationConverter" factory-method="getProperties">
<constructor-arg>
<bean class="org.apache.commons.configuration.DatabaseConfiguration">
<constructor-arg ref="myDataSource"/>
<constructor-arg value="dbo.APPLICATIONPROPERTIES"/>
<constructor-arg value="NAME"/>
<constructor-arg value="VALUE"/>
</bean>
</constructor-arg>
</bean>
</property>
</bean>

<bean id="propertyConfigurer" class="com.fexco.wuams.util.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:database.properties</value>
</list>
</property>
</bean>

我有以下ComboPooledDataSource bean

<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driver}"/>
<property name="jdbcUrl" value="${url}"/>
<property name="user" value="${username}"/>
<property name="password" value="${password}"/>
<property name="initialPoolSize" value="5"/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="5"/>
<property name="maxIdleTime" value="1200"/>
<property name="idleConnectionTestPeriod" value="300"/>
</bean>

它非常适合我的应用程序的其余部分,除非我尝试将它用于我的 bean id="otherPropertyConfigurer"...我收到以下错误

Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:104)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1275)
... 72 more

如果我在ComboPooledDataSource中硬编码数据库变量(例如将${jdbc.driverClassName}更改为net.sourceforge.jtds.jdbc.Driver > 一切正常,但由于某种原因,当我添加 otherPropertyConfigurer 时,我原来的 propertyConfigurer 不起作用

有人知道如何解决这个问题吗?

最佳答案

我讨厌成为坏消息的直白者,但是你想要实现的目标,Spring 物理上无法做到。

因为 Springs PropertyPlaceholderConfigurer 类作为 beanPostProcessors,所以它会在创建任何其他 bean 之前创建并调用这些 bean。但是,如果您有多个 PropertyPlaceholderConfigurer,其中一个依赖于另一个,Spring 将始终在调用其中任何一个实例之前完全创建两个实例。因此,您在 myDataSource 中的占位符永远无法解析。

this question 中更好地描述了该问题。

此问题的最佳解决方案通常是停止使用数据库进行配置管理。我发现最好使用一个简单的配置文件,该文件可以根据环境进行修改,并托管在您的部署容器中。

关于java - PropertyPlaceholderConfigurer 用于读取属性文件和数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28564333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com