Skip to content
Advertisement

How can i fetch property from application-test.properties file in Java class?

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

Advertisement