Circular placeholder reference 'jdbc.driver' in property definitions

Circular placeholder reference 'jdbc.driver' in property definitions

Caused by: 
java.lang.IllegalArgumentException: Circular placeholder reference 'jdbc.driver' in property definitions
 at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:141)
 at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:162)
 at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
 at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer$PlaceholderResolvingStringValueResolver.resolveStringValue(PropertyPlaceholderConfigurer.java:259)
 at org.springframework.beans.factory.config.BeanDefinitionVisitor.resolveStringValue(BeanDefinitionVisitor.java:282)
 at org.springframework.beans.factory.config.BeanDefinitionVisitor.resolveValue(BeanDefinitionVisitor.java:204)
 at org.springframework.beans.factory.config.BeanDefinitionVisitor.visitPropertyValues(BeanDefinitionVisitor.java:141)
 at org.springframework.beans.factory.config.BeanDefinitionVisitor.visitBeanDefinition(BeanDefinitionVisitor.java:82)
 at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:208)
 at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:223)
 at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:86)
 at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:265)
 at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:162)
 at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462)
 at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
 at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
 at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
 at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:801)
 at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:446)
 at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:793)
 at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:296)
 at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1347)
 at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:745)
 at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492)
 at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:282)
 at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
 at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:117)
 at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:99)
 at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
 at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:154)
 at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
 at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:117)
 at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:99)
 at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
 at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
 at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:117)
 at org.eclipse.jetty.server.Server.start(Server.java:358)
 at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:99)
 at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
 at org.eclipse.jetty.server.Server.doStart(Server.java:325)
 at org.eclipse.jetty.maven.plugin.JettyServer.doStart(JettyServer.java:68)
 at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
 at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:564)
 at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:360)
 at org.eclipse.jetty.maven.plugin.JettyRunMojo.execute(JettyRunMojo.java:168)
 at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133)
 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
 at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)
 at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76)
 at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
 at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116)
 at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)
 at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
 at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
 at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213)
 at org.apache.maven.cli.MavenCli.main(MavenCli.java:157)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:606)
 at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
 at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
 at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
 at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
 at org.codehaus.classworlds.Launcher.main(Launcher.java:46)

 

三个文件:

pom.xml:

<properties>
<jdbc.driver>com.mysql.jdbc.Driver</jdbc.driver>
</properties>

jdbc.properties:

jdbc.driver=${jdbc.driver}

applicationContext.xml:

<property name="driver" value="${jdbc.driver}"/>

 

报错:

Circular placeholder reference 'jdbc.driver' in property definitions

 

解决方式:

在 pom.xml 里加上下面这段:

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>

<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>

 

问题解决!


-----------------------------------------------------------------------

如何在properties文件中获取maven的 pom.xml 的键值?
答案就是:在资源文件(*.properties)中放置pom.xml预先设置的变量, 在执行mvn package时就会自动将变量替换为真实值
例如:
1. 我们在src\main\resources\application.properties放置如下内容
     version=${project.version}
2. 配置pom.xml让Maven to copy that file into your output classes and translate the resource during that copy, interpreting the property
<!--一定要加上这个,不然在别的配置文件中是读不到这里配置的参数的-->      
<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
3. 执行mvn package
    查看生成的jar文件中的application.properties, version值已经变成了pom.xml中的version

因此我们只需使用java读取application.properties即可


---------------------------------------------------

一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,maven能把这些资源文件打包到相应的jar或者war里。但是如果pom.xml中没有<build>...</build>   相应的xxx.properties 中就获取不到pom.xml配置的变量。如${database.url}。所以pom中配置<build> 是xxx.properties,xxx.xml 中获取pom中配置的变量的关键!!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误表示在属性定义中存在对 "server.port" 属性的循环占位符引用。这通常是由于在定义属性时使用了类似于 "${server.port}" 的占位符,但是该属性本身又引用了 "server.port" 属性,从而导致循环引用。 要修复这个问题,可以考虑以下几个步骤: 1. 检查属性定义,确保没有循环引用。如果存在循环引用,需要重新设计属性的依赖关系。 2. 如果必须使用占位符引用 "server.port" 属性,可以考虑使用 Spring Boot 的 Environment 对象来获取该属性的值,而不是直接引用它。 3. 如果无法避免循环引用,可以尝试使用懒加载方式加载属性,以延迟属性的解析过程,从而避免循环引用。 总之,要修复 Circular placeholder reference 'server.port' in property definitions 错误,需要仔细检查属性定义,找出循环引用的原因,并采取适当的措施来解决问题。 ### 回答2: Circular placeholder reference 'server.port' in property definitions 表示在属性定义中存在循环占位符引用 'server.port'。 这个错误通常出现在Spring框架的应用程序中,由于配置文件中的属性引用出现了循环依赖。 循环引用的意思是,属性A的值依赖于属性B的值,而属性B的值又依赖于属性A的值,从而导致无法解析属性的值,最终引发占位符引用错误。 解决这个问题的方法是检查应用程序的配置文件,确保属性引用没有形成循环依赖。一种常见的解决方案是通过提取公共的属性到一个独立的配置文件,以便可以在不产生循环依赖的情况下引用这些属性。 另外,可以通过使用Spring框架提供的占位符解析机制来解决这个问题。在配置文件中,可以使用占位符来引用属性值,而不是直接使用属性名称。这样可以确保属性值在解析时被正确地填充,避免循环引用的问题。 总之,解决Circular placeholder reference 'server.port' in property definitions错误的关键是检查配置文件中的属性引用,确保它们没有形成循环依赖,并使用合适的占位符解析机制来引用属性值。 ### 回答3: Circular placeholder reference 'server.port' in property definitions是在Spring框架中遇到的错误。这个错误的原因是在应用的配置文件中存在一个循环引用的属性定义。 当我们使用Spring框架开发应用时,我们通常会使用属性占位符来配置一些参数。这些属性值可以通过配置文件或者命令行参数来传递。在配置文件中,我们可以使用${}语法来引用属性占位符。 当出现Circular placeholder reference 'server.port'这个错误时,意味着属性'port'的值被定义为引用另一个属性的占位符,而另一个属性的值又引用了'port'属性的占位符,形成了一个循环引用。 这种情况会导致Spring框架无法解析属性的值,因为它陷入了一个无限循环。为了解决这个问题,我们需要检查应用的配置文件,找到这个循环引用的属性定义,并修改它们,以避免循环引用的出现。 一种常见的解决办法是重新定义属性的顺序,确保属性的值不会引用尚未解析的属性。另一种方法是使用其他方式来传递属性的值,而不是使用属性占位符,例如使用硬编码的值或直接在代码中设置属性的值。 总之,解决Circular placeholder reference 'server.port' in property definitions的错误需要检查应用的配置文件,并修改引起循环引用的属性定义,以确保属性的值可以正确解析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值