我通过带有mvn清洁安装spring-boot: run
的maven在嵌入式tomcat服务器上运行spring-boot。但是每次我运行它都会收到这个错误:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'language' in string value "${language}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at 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.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
... 35 common frames omitted
该错误与这两行代码有关:
@Value("${language}")
private String language;
该语言标志在我的application.properties中指定如下:
application.properties
language=java
logging.level.org.springframework=TRACE
这是令人困惑的部分:当我在没有spring-boot: run命令的情况下运行构建时,它会正确构建,我可以毫无问题地运行构建的jar。只有当我尝试在嵌入式tomcat服务器上运行时,我才会遇到这个问题。
我可以通过在我的代码中执行此操作来绕过它:
@Value("${language:java}")
private String language;
但这对我来说没有意义,因为Spring应该自动从application.properties
文件中读取默认值。
编辑:正如人们所指出的,在嵌入式tomcat服务器上运行时,它根本不会读取application.properties
。有什么方法可以强制它读取文件,或者为什么它可能没有读取它?当部署到外部应用服务器而不是嵌入式服务器时,它工作得很好。
通过将这些行添加到下的pom来修复
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
我不完全理解的是这样做的必要性。
a)我可以在外部应用服务器上运行它,而无需添加此行,应用程序读取application.properties
就可以了。
b)我可以在eclipse中作为独立的java应用程序运行该应用程序(即,无需通过maven构建应用程序),它可以读取application.properties
c)spring-boot是否应该默认读取它?(如上两种情况所示?)
谢谢大家的帮助。希望这将有助于其他人。
从IntelliJ运行时,我也遇到了类似的问题。这对我有用:构建-
IntelliJ也遇到了同样的问题。使文件中的缓存无效-