Spring Boot: Wert aus Config Datei ermitteln

Diskutiere Spring Boot: Wert aus Config Datei ermitteln im Allgemeine Java-Themen Bereich.
S

Schuriko

Ich habe im src/main/resources eine eigene Konfigurationsdatei myapp.properties:
Code:
basedirectory = test
Meine Spring Applikation sieht wie folgt aus:
Code:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.schuriko.myapp.config.AppConfig;

@SpringBootApplication
@EnableConfigurationProperties
@ConfigurationPropertiesScan
public class MyAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyAppApplication.class, args);
       
        AppConfig ac = new AppConfig();
        System.out.println(ac.baseDirectory);
    }
}
Und die AppConfig sieht wie folgt aus:
Code:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;

@PropertySource(value = { "classpath:myapp.properties" })
public class AppConfig {
   
    @Value("${basedirectory}")
    public String baseDirectory;
   
    @Bean
    public String getBaseDirectory() {
        return baseDirectory;
    }
   
}
Ich habe hierfür nur eine Getter-Funktion geschrieben, damit ich eine "Nur lese"-Funktion habe.

Die print - function der Main-Funktion gibt "null" aus. Und nicht wie erwartet "test"
Ich bin jetzt hier schon einige Stunden am rumtüffteln, habe mir etliche tutorials nochmal angeschaut. Aber irgendwie sehe ich momentan nur den Wald vor lauter Bäumen nicht mehr. Kann mir bitte jemand weiterhelfen
 
H

httpdigest

Du hast zwei Fehler in deinem Setup:
1. AppConfig ist noch keine Bean, somit würde es von Spring Boot zur Laufzeit auch nicht erkannt und als PropertySource verwendet werden. Annotiere AppConfig also mit `org.springframework.context.annotation.Configuration`.
2. Du instanziierst AppConfig auch direkt per `new`. Somit kann Spring auch kein Injection der Properties vornehmen. Das ist in etwa so, als würdest du eine Spring Bean mit @AutoWired Instanzvariablen definieren und diese direkt per `new` instanziieren. Das geht auch nicht. Du musst also den Kontext nach dem Bean fragen.

Insgesamt also:
Java:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource(value = { "classpath:myapp.properties" })
public class AppConfig {
    @Value("${basedirectory}")
    private String baseDirectory;
    public String getBaseDirectory() {
        return baseDirectory;
    } 
}
und:
Java:
public static void main(String[] args) {
    ConfigurableApplicationContext ctx = SpringApplication.run(MyAppApplication.class, args);
    AppConfig config = ctx.getBean(AppConfig.class);
    System.out.println(config.getBaseDirectory());
}
 
S

Schuriko

Danke dir!

Aber! Ich glaube ich stehe immer noch im Wald. Ich möchte von einer Service Klasse auf AppConfig.getBaseDirectory zugreifen.
Wie kann ich das machen?
 
H

httpdigest

Da die AppConfig einfach nur eine PropertySource definiert, kannst du die Properties einfach per @Value benutzen:
Java:
@Service
public DeinService {
  @Value("${baseDirectory}")
  private String baseDirectory;

  public void methodeDieBaseDirectoryVerwendet() {
    // ... this.baseDirectory ...
  }
}
EDIT:
Genausogut hättest du die Annotation `@PropertySource(value = { "classpath:myapp.properties" })` auch an deine Main-Klasse (die mit der SpringBootApplication Annotation) hängen können. Aber wahrscheinlich willst du ein POJO definieren, welches deine Properties per Getter zugreifbar macht, ohne, dass du immer die Werte per Value-Annotation überall rankleben musst.
Das geht mit der ConfigurationProperties Annotation. Schau mal hier: https://www.baeldung.com/spring-enable-config-properties bzw. hier: https://www.baeldung.com/configuration-properties-in-spring-boot
 
Zuletzt bearbeitet:
Thema: 

Spring Boot: Wert aus Config Datei ermitteln

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben