Reputation: 1380
I am running spring-boot on an embedded tomcat server through maven with mvn clean install spring-boot:run
. But every time I run it I get this error:
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
That error is regarding these two lines of code:
@Value("${language}")
private String language;
That language flag is specified in my application.properties like this:
application.properties
language=java
logging.level.org.springframework=TRACE
This is the confusing part: When I run the build without the spring-boot:run command, it builds properly and I can run the built jar with no issues at all. It is only when I try to run on the embedded tomcat server I run into this issue.
I can sort of bypass this by doing this in my code:
@Value("${language:java}")
private String language;
But that doesn't make sense to me since spring is supposed to read the default value from the application.properties
file automatically.
EDIT: as people have pointed out, it is not reading application.properties
at all when run on the embedded tomcat server. Any way to force it to read the file or a reason why it may not be reading it? It works fine when deployed to an external app server instead of the embedded one.
Upvotes: 38
Views: 240846
Reputation: 61
If you have multiple .properties files, you can force a specific one with the annotation @PropertySource("classpath:yourProperty.properties")
at the beginning of the class declaration, or define an array of configurations to look for in order, like this: @PropertySources({ @PropertySource("classpath:application.properties"), @PropertySource("classpath:application2.properties") })
Upvotes: 0
Reputation: 6778
I was missing the below dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
I need read config values for ceneralized config server .
Upvotes: 2
Reputation: 101
I have similar issue with you, I fixed it by going
In your pom.xml
if you have multiple profile or properties, select 1 profile to be default selected
<profiles>
<profile>
<id>dev</id>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<activatedProperties>prod</activatedProperties>
</properties>
</profile>
</profiles>
Then go to your application.properties
then insert this code
spring.profiles.active=@activatedProperties@
Upvotes: 3
Reputation: 475
I had a missing property of the SpringApplication
defaultProperties
.
I had to add the property "spring.profiles.default"
with the value "dev"
.
Upvotes: 0
Reputation: 11
Happened with me too. in my case the problem was caused because I put the value in wrong file. wrong BIN/src/main/resource/application.properties right src/main/resource/application.properties
Upvotes: 1
Reputation: 1888
In my case I had set an OS environment variable spring.config.location
for some other purpose. This was over-riding the project path for spring config in eclipse.
After removing the environment variable, rebooting and re-importing projects in eclipse the above issue was resolved
Upvotes: 0
Reputation: 293
In my case changing this:
@Value("${files.root}")
to this:
@Value("${files.root:default}")
worked.
See following for my solution: https://www.bswen.com/2019/06/springboot-How-to-resolve-IllegalArgumentException-Could-not-resolve-placeholder-when-use-@Value-in-Spring-or-SpringBoot-app.html
Upvotes: 8
Reputation: 184
Got the same issue with IntelliJ. Invalidating caches from File -> Invalidate Caches / Restart ...
fixed it for me.
Upvotes: 14
Reputation: 43
If you have set the values properly, then check if your resources folder is acting as "resources" identified by the IDE. In intelliJ you can right click on resources and select "Mark as resources root".
Upvotes: 1
Reputation: 188
Here I have simplest solution that worked in my case.
Whether it be from Java command prompt, or VM options from IDE such as eclipse or IntelliJ, try supplying the following:
-Dspring.profiles.active=<env>
This is alternative to modifying/touching the pom file mentioned above.
Upvotes: 0
Reputation: 868
I too faced a similar issue when running from IntelliJ. This worked for me : Build -> Rebuild Project.
Upvotes: 25
Reputation: 982
In my case, in IntelliJ, I used a different profile. So choosing a dev profile in my case, solved an issue.
Upvotes: 3
Reputation: 14675
Were you, by chance, running this from Eclipse?
I had the same issue and noticed that the project did not have the Maven nature. Right-clicking on the project ->Configure->Convert to Maven Project. Then right-click on the project ->Maven->Update Project solved the issue.
Upvotes: 5
Reputation: 1247
If the above changes in pom.xml
file still doesn't solve the problem try below option.
Add the @PropertySource
annotation at the top of your class
@PropertySource(
{
"classpath:/application.properties",
"classpath:/${spring.profiles.active}/application-${spring.profiles.active}.properties"
}
)
If that still doesn't solve try adding the following annotation
@EnableAutoConfiguration
Salam
Upvotes: -4
Reputation: 1380
Fixed by adding these lines to the pom under the <resources>
section
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
What I don't fully understand is the need for doing this.
a) I can run this on an external app server without having to add this line and the app reads application.properties
just fine.
b) I can run the app as a standalone java application in eclipse (i.e., without having to build the app through maven) and it reads application.properties
just fine
c) isn't spring-boot supposed to read it by default regardless? (as shown by the two cases above?)
Thanks everyone for their help. hopefully this will help others.
Upvotes: 40