Could not resolve placeholder 'driverClasss' in string value "${driverClasss}"

本文介绍了一个关于Spring配置中使用占位符无法正确解析的问题,通过更改配置方式解决了该问题,确保了项目的正常启动。
部署运行你感兴趣的模型镜像

spring配置:spring-datasource.xml


    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
             <list>
                <value>classpath*:/spring/jdbc.properties</value>
            </list>
        </property>
    </bean>


jdbc配置:jdbc.properites

driverClassName=org.gjt.mm.mysql.Driver
url=jdbc\:mysql\://locahost\:3306/test?useUnicode\=true&amp;characterEncoding\=utf-8
username=root
password=root
initialSize=1
maxActive=100
maxIdle=8
minIdle=1


eclipse启动项目出现如下错误:


nnerConfigurer#0,sqlSessionTemplate,transactionManager,DB_StoreService_BOMethod,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,DB_StoreService_Advice,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
2017-08-07 09:11:17 ERROR Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in URL [file:/D:/use_soft/apache-tomcat-7.0.64/webapps/testDemo/WEB-INF/classes/spring/spring-datasource.xml]: Could not resolve placeholder 'driverClasss' in string value "${driverClasss}"
    at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:220)
    at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:84)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:669)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5003)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1263)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1948)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
八月 07, 2017 9:11:17 上午 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in URL [file:/D:/use_soft/apache-tomcat-7.0.64/webapps/testDemo/WEB-INF/classes/spring/spring-datasource.xml]: Could not resolve placeholder 'driverClasss' in string value "${driverClasss}"
    at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:220)
    at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:84)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:669)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5003)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1263)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1948)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
八月 07, 2017 9:11:17 上午 org.apache.catalina.core.StandardContext startInternal
严重: One or more listeners failed to start. Full details will be found in the appropriate container log file


解决办法:

修改spring-datasource.xml配置文件,不用org.springframework.beans.factory.config.PropertyPlaceholderConfigurer配置方式,改成用<context:property-placeholder/>加载方式。

例如:

<context:property-placeholder order="0"  location="classpath:/spring/jdbc.properties" ignore-unresolvable="true"/>


修改后,从起项目,成功重启。



您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### 关于Spring Placeholder无法解析的问题 当遇到`placeholder could not resolve placeholder in value ${}` 的问题时,通常是因为占位符未被正确替换为实际值。以下是可能的原因及其解决方案: #### 原因分析 1. **PropertyPlaceholderConfigurer加载顺序问题** 如果项目中有多个`PropertyPlaceholderConfigurer`实例,可能会导致某些bean在占位符解析之前就被创建。这会使得这些bean中的占位符无法被正确解析[^2]。 2. **资源文件路径不正确** 占位符的值来源于配置文件(如`.properties`),如果指定的资源配置文件路径有误或者文件不存在,则会导致占位符无法解析。 3. **上下文中缺少必要的配置器** 虽然可以使用`PropertyPlaceholderConfigurer`来处理占位符,但如果系统属性始终存在,也可以依赖Spring内置的`ResourceEditor`完成占位符替换工作[^1]。 4. **注解方式下的特殊行为** 使用`@Value("${...}")`注入占位符时,可能存在解析失败的情况。例如,在某些场景下`${db.driver}`会被直接打印出来而不是其对应的值[^3]。 #### 解决方案 ##### 方法一:调整PropertyPlaceholderConfigurer的加载时机 可以通过设置`ignoreUnresolvablePlaceholders=true`让程序忽略那些暂时无法解析的占位符,从而避免启动阶段报错。另外,确保所有的`PropertyPlaceholderConfigurer`都在其他bean初始化前执行完毕。 ```java @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { return new PropertySourcesPlaceholderConfigurer(); } ``` ##### 方法二:验证并修正.properties文件位置 确认项目的classpath中确实包含了所需的`.properties`文件,并且路径声明无误。例如: ```xml <context:property-placeholder location="classpath*:application.properties"/> ``` ##### 方法三:采用Environment接口替代硬编码 利用Spring提供的`Environment`抽象类动态获取环境变量或配置项,这种方法更加灵活可靠。 ```java @Autowired private Environment env; public String getDbDriver(){ return env.getProperty("db.driver"); } ``` ##### 方法四:检查自动装配逻辑 对于需要强制赋值的字段,推荐优先考虑`@Autowired(required=false)`而非`@Required`注释,因为后者要求必须提供具体实现,否则抛出异常;而前者允许为空情况发生[^4]。 --- ### 示例代码展示 下面给出一段完整的示例代码用于演示如何正确配置以及访问数据库驱动名: ```java @Configuration @PropertySource("classpath:database.properties") public class DatabaseConfig { @Autowired private Environment environment; public void printDatabaseInfo(){ System.out.println(environment.getProperty("db.driver")); } } // database.properties 文件内容如下: db.driver=oracle.jdbc.driver.OracleDriver ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值