I have set the variable “spring.profiles.active” in my environment to “test” and I have below file in my src/main/resources.
application-test.properties
It has one property “machine”
machineName=mumbai
I want to access this property in one of my Java based class.
package com.test.service; @Component @RequiredArgsConstructor public class TestMachine { @Value("${machineName}") private String machineName; @Override public void checkMachine() { System.out.println(machineName); } }
PropertiesConfig class:
@Configuration public class PropertiesUtils { public static void initProperties() { String activeProfile = System.getProperty("spring.profiles.active"); if (activeProfile == null) { activeProfile = "test"; } PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); Resource[] resources = new ClassPathResource[] {new ClassPathResource("application.properties"), new ClassPathResource("application-" + activeProfile + ".properties")}; propertySourcesPlaceholderConfigurer.setLocations(resources); } }
But while running this as a Spring boot application in Eclipse. I am getting below error:
Error creating bean with name 'TestMachine': Injection of autowired dependencies failed; Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'machineName' in value "${machineName}" at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) ~[spring-core-5.3.9.jar:5.3.9]
What am I missing? I found this way only in most of the websites.
Advertisement
Answer
To give you a better answer please show your application.properties and the full stacktrace, but this may help.
You can get the current profile using the Environment
class.
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; @SpringBootApplication public class DemoApplication { @Autowired Environment env; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean public CommandLineRunner run() { return new CommandLineRunner() { @Override public void run(String... args) { for (var p: env.getActiveProfiles()) { System.out.println(p); } } }; } }
And pass the profile via cli
use this
mvn spring-bot:run -Dspring-boot.run.profiles=test
or
gradle bootRun --args "'--spring.profiles.active=test'"
or
java -jar *.jar -Dspring.profiles.active=test