Cork Kochi
Cork Kochi

Reputation: 1891

Spring Boot application to read a value from properties file in main method

I am trying to get the value of a property

hello.world=Hello World

in MainApp class

@SpringBootApplication
public class MainApp {
   public static void main(String[] args) {
      SpringApplication.run(MainApp.class, args);
}

This didn't work as its the main method.

@Value("${hello.world}")
public static String helloWorld;

Maybe its possible to load by

  Properties prop = new Properties();

    // load a properties file
    prop.load(new FileInputStream(filePath));

Is there any other better way to get the properties using Spring in the main method of SpringBoot before SpringApplication.run

Upvotes: 7

Views: 19545

Answers (6)

Tomasz S
Tomasz S

Reputation: 202

Don't do this. Its better to use CommandLineRunner. Thanks to this you can have a non static method that Spring Boot will run for you automatically:

@SpringBootApplication
public class SimulatorApplication implements CommandLineRunner {

@Value("${my-value}")
private myValue;

public static void main(String[] args) {
  SpringApplication.run(SimulatorApplication.class, args);
}

@Override
public void run(String... args) throws Exception {
  // here you can access my-value
}

}

Upvotes: 2

Vishal Bhama
Vishal Bhama

Reputation: 11

ApplicationContext applicationContext = SpringApplication.run(Application.class, args);

String applicationPropertyVersion=applicationContext.getEnvironment().getProperty("application.property.version");

    LOGGER.info("RELEASE CODE VERSION {} and applicationProperty Version {} ", LcoBuildVersion.version,
            applicationPropertyVersion);

Upvotes: 1

Cork Kochi
Cork Kochi

Reputation: 1891

@SpringBootApplication
public class MainApp {
   public static void main(String[] args) {
     SpringApplication springApplication = new SpringApplication(MainApp.class);
     springApplication.addListeners(new VersionLogger());
     springApplication.run(args);
}


// The VersionLogger Class
public class VersionLogger implements ApplicationListener<ApplicationEnvironmentPreparedEvent>{

  @Override
  public void onApplicationEvent(ApplicationEnvironmentPreparedEvent applicationEvent) {
    String helloWorld = applicationEvent.getEnvironment().getProperty("hello.world");
  }
}

ApplicationEnvironmentPreparedEvent Event published when a SpringApplication is starting up and the Environment is first available for inspection and modification.

Upvotes: 1

Amaravathi
Amaravathi

Reputation: 145

We can't read values into static fields . Here is the explanation gives a better insight How to assign a value from application.properties to a static variable?

Upvotes: 0

pvpkiran
pvpkiran

Reputation: 27078

You have declared the variable helloWorld as static. Hence you need to use Setter Injection and not Field Injection.

Injecting a static non-final field is a bad practice. Hence Spring doesn't allow it. But you can do a workaround like this.

public static String helloWorld;

      @Value("${hello.world}")
        public void setHelloWorld(String someStr) {
          helloWorld = someStr
        }

You can access this variable helloWorld at any point in the class, if its any other class. But if you want to do it in the main class. You can access the variable only after this line

SpringApplication.run(MainApp.class, args);)

i.e only after the application has started.

Upvotes: 4

sanit
sanit

Reputation: 1764

ConfigurableApplicationContext ctx = 
           SpringApplication.run(MainApp.class, args);
String str = ctx.getEnvironment().getProperty("some.prop");
System.out.println("=>>>> " + str);

Upvotes: 11

Related Questions