Spring引导无法解析字符串中的占位符

Kar*_*ran 7 java spring tomcat spring-mvc maven

我通过maven在嵌入式tomcat服务器上运行spring-boot mvn clean install spring-boot:run.但每次我运行它我都会收到此错误:

引起:java.lang.IllegalArgumentException:无法解析org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)〜[spring-core-4.3]中字符串值"$ {language}"中的占位符'language'. 6.RELEASE.jar:4.3.6.RELEASE]在org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)〜[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE] at at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236)〜[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE] org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders (AbstractPropertyResolver.java:210)〜[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE] org.springframework.context.support.PropertySourcesPlaceholderConfigurer $ 2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172)~ [spring -context-4.3.6.RELEASE.jar:4.3.6.RELEASE] at org.springframework.beans.factory.support.Abst org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency上的ractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831)~ [spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE](DefaultListableBeanFactory.java:1086 )〜[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)〜[spring-beans-4.3. 6.RELEASE.jar:4.3.6.RELEASE]在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)〜[spring-beans-4.3.6.RELEASE.jar:4.3 .6.RELEASE] org.springframework上的org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)〜[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] .beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)〜[spring-beans-4 .3.6.RELEASE.jar:4.3.6.RELEASE] ...省略了35个常用帧

该错误与这两行代码有关:

@Value("${language}")
private String language;
Run Code Online (Sandbox Code Playgroud)

那个语言标志在我的application.properties中指定,如下所示:

application.properties

language=java
logging.level.org.springframework=TRACE
Run Code Online (Sandbox Code Playgroud)

这是一个令人困惑的部分:当我在没有spring-boot:run命令的情况下运行构建时,它构建正确,我可以运行构建的jar而没有任何问题.只有当我尝试在嵌入式tomcat服务器上运行时,我才遇到这个问题.

我可以通过在我的代码中执行此操作来绕过这个:

@Value("${language:java}")
private String language;
Run Code Online (Sandbox Code Playgroud)

但这对我来说没有意义,因为spring应该application.properties自动从文件中读取默认值.

编辑:正如人们所指出的那样,application.properties在嵌入式tomcat服务器上运行时根本不读取.有什么方法可以强迫它读取文件或者它可能没有读取它的原因?部署到外部应用服务器而不是嵌入式应用服务器时,它可以正常工作.

在此先感谢您的帮助.

Kar*_*ran 14

通过将这些行添加到该<resources>部分下的pom来修复

<resource>
     <directory>src/main/resources</directory>
     <filtering>true</filtering>
     <includes>
          <include>**/*.properties</include>
     </includes>
</resource>
Run Code Online (Sandbox Code Playgroud)

我不完全理解的是需要这样做.

a)我可以在外部应用服务器上运行它,而无需添加此行,应用程序读取application.properties就好了.

b)我可以在eclipse中将应用程序作为独立的java应用程序运行(即,无需通过maven构建应用程序)并且它读起来application.properties很好

c)不是弹簧启动应该默认读取它吗?(如上面的两个案例所示?)

谢谢大家的帮助.希望这会有助于其他人.

  • 我猜你没有在 pom.xml 中继承 spring-boot-starter-parent 这就是为什么。 (2认同)

flo*_*poe 13

IntelliJ 也有同样的问题。使缓存失效File -> Invalidate Caches / Restart ...为我修复了这个问题。


Sum*_*man 11

从 IntelliJ 运行时,我也遇到了类似的问题。这对我有用:构建-> 重建项目。


Pau*_*kin 5

您是偶然从 Eclipse 运行这个程序的吗?

我遇到了同样的问题,并注意到该项目不具有 Maven 性质。右键单击项目->配置->转换为 Maven 项目。然后右键单击项目->Maven->更新项目解决了问题。