Come accedere a un valore definito nel file application.properties in Spring Boot


312

Voglio accedere ai valori forniti in application.properties, ad esempio:

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
logging.file=${HOME}/application.log

userBucket.path=${HOME}/bucket

Voglio accedere userBucket.pathal mio programma principale in un'applicazione Spring Boot.

Risposte:


467

È possibile utilizzare l' @Valueannotazione e accedere alla proprietà in qualunque bean Spring che si sta utilizzando

@Value("${userBucket.path}")
private String userBucketPath;

La sezione Configurazione esterna dei documenti di Spring Boot, spiega tutti i dettagli di cui potresti aver bisogno.


5
in alternativa si possono ottenere anche quelli dalla primavera Environmento via@ConfigurationProperties
sodik

3
Per aggiungere la risposta di @ sodik, questo è un esempio che mostra come ottenere l' ambiente stackoverflow.com/questions/28392231/…
cristi

E se dovessi accedere a più di 10 valori, dovresti continuare a ripetere il tuo esempio 10 volte?
Jesse,

un approccio sarebbe quello di farlo, ma è ingombrante. Ci sono approcci alternativi basati sulle @Configurationclassi, il problema è ben analizzato nel seguente post sul blog
Master Slave il

2
Nota, questo funziona solo su un @Component(o uno qualsiasi dei suoi derivati, cioè @Repository, ecc.)
Janac Meena,

211

Un altro modo è l'iniezione org.springframework.core.env.Environmental tuo bean.

@Autowired
private Environment env;
....

public void method() {
    .....  
    String path = env.getProperty("userBucket.path");
    .....
}

6
utile anche quando il nome della proprietà di cui hai bisogno per accedere cambia in modo dinamico
Paulo Merson,

3
Cosa succede se si desidera cercare le proprietà? E posso suggerire di includere la dichiarazione di importazione in modo che tutti possano vedere il nome del pacchetto Environment, probabilmente org.springframework.core.env.Environment
chrisinmtown

2
Fare attenzione a non importare l'ambiente sbagliato. Intellij ha importato automaticamente l'ambiente CORBA.
Janac Meena,

3
Perché il mio env è nullo?
Janac Meena,

2
@JanacMeena ha avuto lo stesso problema della classe CORBA di importazione automatica IntelliJ anzichéorg.springframework.core.env.Environment
Rasshu,

31

@ConfigurationPropertiespuò essere utilizzato per mappare i valori da .properties( .ymlanche supportato) a un POJO.

Considera il seguente file di esempio.

.proprietà

cust.data.employee.name=Sachin
cust.data.employee.dept=Cricket

Employee.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@ConfigurationProperties(prefix = "cust.data.employee")
@Configuration("employeeProperties")
public class Employee {

    private String name;
    private String dept;

    //Getters and Setters go here
}

Ora è possibile accedere al valore delle proprietà autowiring employeePropertiescome segue.

@Autowired
private Employee employeeProperties;

public void method() {

   String employeeName = employeeProperties.getName();
   String employeeDept = employeeProperties.getDept();

}

1
ho usato in questo modo e ho ottenuto un ritorno nullo, ho messo il mio file delle proprietà nella classe java src / test / resources e properties (in cui il valore delle proprietà viene salvato) in src / main / package / properties. cosa mi sono perso? grazie
Ahmad Leo Yudanto,

devi salvare i file src/main/resourcesse non stai testando il tuo codice da un test di primavera.
JoBⅈN

Lo stesso di @AhmadLeoYudanto e non c'è nulla che io possa fare per cambiarlo
Dimitri Kopriwa

6

Attualmente, conosco i seguenti tre modi:

1. L' @Valueannotazione

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • Nella mia esperienza ci sono alcune situazioni in cui non si è in grado di ottenere il valore o è impostato su null. Ad esempio, quando si tenta di impostarlo in un preConstruct()metodo o in un init()metodo. Ciò accade perché l'iniezione di valore avviene dopo che la classe è stata completamente costruita. Ecco perché è meglio usare la 3a opzione.

2. L' @PropertySourceannotazione

<pre>@PropertySource("classpath:application.properties")

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySouceimposta i valori dal file sorgente della proprietà in una Environmentvariabile (nella tua classe) quando la classe viene caricata. Quindi sei in grado di recuperare facilmente postfazione.
    • Accessibile tramite la variabile di ambiente di sistema.

3. L' @ConfigurationPropertiesannotazione.

  • Viene utilizzato principalmente nei progetti Spring per caricare le proprietà di configurazione.
  • Inizializza un'entità in base ai dati di proprietà.

    • @ConfigurationProperties identifica il file delle proprietà da caricare.
    • @Configuration crea un bean in base alle variabili del file di configurazione.
    @ConfigurationProperties (prefix = "user")
    @Configuration ( "UserData")
    utente di classe {
      // Proprietà e loro getter / setter
    }
    
    @Autowired
    UserData privato UserData;
    
    userData.getPropertyName ();

Cosa succede se la posizione predefinita viene sostituita con spring.config.location? # 2 funziona ancora?
bmauter,

In tal caso, la priorità entra nel posto. Come so, quando si imposta spring.config.location utilizzando la riga di comando, ha priorità alta, quindi ha la precedenza su quello esistente.
Dhwanil Patel,

5

Puoi farlo anche in questo modo ....

@Component
@PropertySource("classpath:application.properties")
public class ConfigProperties {

    @Autowired
    private Environment env;

    public String getConfigValue(String configKey){
        return env.getProperty(configKey);
    }
}

Quindi, ovunque tu voglia leggere da application.properties, passa la chiave al metodo getConfigValue.

@Autowired
ConfigProperties configProp;

// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port"); 

1
Che pacchetto è Environment?
e-info128

1
Lo trovi qui: org.springframework.core.env.Environment
lucifer

Cosa succede se la posizione predefinita viene sostituita con spring.config.location?
bmauter,

3

È possibile utilizzare il @Valueper caricare variabili dal application.propertiesse si utilizzerà questo valore in un unico posto, ma se è necessario un modo più centralizzato per caricare queste variabili @ConfigurationPropertiesè un approccio migliore.

Inoltre, è possibile caricare variabili e trasmetterle automaticamente se sono necessari diversi tipi di dati per eseguire le convalide e la logica aziendale.

application.properties
custom-app.enable-mocks = false

@Value("${custom-app.enable-mocks}")
private boolean enableMocks;

3

Segui questi passi. 1: - crea la tua classe di configurazione come sotto puoi vedere

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;

@Configuration
public class YourConfiguration{

    // passing the key which you set in application.properties
    @Value("${userBucket.path}")
    private String userBucket;

   // getting the value from that key which you set in application.properties
    @Bean
    public String getUserBucketPath() {
        return userBucket;
    }
}

2: - quando si dispone di una classe di configurazione, iniettare nella variabile da una configurazione in cui è necessario.

@Component
public class YourService {

    @Autowired
    private String getUserBucketPath;

    // now you have a value in getUserBucketPath varibale automatically.
}

1
1.Injecting a property with the @Value annotation is straightforward:
@Value( "${jdbc.url}" )
private String jdbcUrl;

2. we can obtain the value of a property using the Environment API

@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

1

Un'applicazione può leggere 3 tipi di valore dal file application.properties.

application.properties


     my.name=kelly

my.dbConnection ={connection_srting:'http://localhost:...',username:'benz',password:'pwd'}

file di classe

@Value("${my.name}")
private String name;

@Value("#{${my.dbConnection}}")
private Map<String,String> dbValues;

Se non si possiede una proprietà in application.properties, è possibile utilizzare il valore predefinito

        @Value("${your_name : default value}")
         private String msg; 

0

Spring-boot ci consente diversi metodi per fornire configurazioni esternalizzate, puoi provare a utilizzare i file application.yml o yaml invece del file delle proprietà e fornire una diversa configurazione dei file delle proprietà in base a diversi ambienti.

È possibile separare le proprietà di ciascun ambiente in file yml separati in profili di primavera separati, quindi durante la distribuzione è possibile utilizzare:

java -jar -Drun.profiles=SpringProfileName

per specificare quale profilo di primavera utilizzare. Notare che i file yml devono essere simili al nome

application-{environmentName}.yml

per essere automaticamente ripresi da Springboot.

Riferimento: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties

Per leggere dal file application.yml o dalle proprietà:

Il modo più semplice per leggere un valore dal file di proprietà o yml è utilizzare l'annotazione spring @value. Pring carica automaticamente tutti i valori dall'YML all'ambiente Spring, in modo da poter utilizzare direttamente quei valori dall'ambiente come:

@Component
public class MySampleBean {

@Value("${name}")
private String sampleName;

// ...

}

O un altro metodo fornito da Spring per leggere i bean fortemente tipizzati è il seguente:

YML

ymca:
    remote-address: 192.168.1.1
    security:
        username: admin

POJO corrispondente per leggere il codice yml:

@ConfigurationProperties("ymca")
public class YmcaProperties {
    private InetAddress remoteAddress;
    private final Security security = new Security();
    public boolean isEnabled() { ... }
    public void setEnabled(boolean enabled) { ... }
    public InetAddress getRemoteAddress() { ... }
    public void setRemoteAddress(InetAddress remoteAddress) { ... }
    public Security getSecurity() { ... }
    public static class Security {
        private String username;
        private String password;
        public String getUsername() { ... }
        public void setUsername(String username) { ... }
        public String getPassword() { ... }
        public void setPassword(String password) { ... }
    }
}

Il metodo sopra funziona bene con i file yml.

Riferimento: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html


0

Per me, nessuna delle precedenti ha funzionato direttamente per me. Quello che ho fatto è il seguente:

Inoltre, alla risposta di @Rodrigo Villalba Zayas, ho aggiunto
implements InitializingBeanalla classe
e implementato il metodo

@Override
public void afterPropertiesSet() {
    String path = env.getProperty("userBucket.path");
}

Così sembrerà

import org.springframework.core.env.Environment;
public class xyz implements InitializingBean {

    @Autowired
    private Environment env;
    private String path;

    ....

    @Override
    public void afterPropertiesSet() {
        path = env.getProperty("userBucket.path");
    }

    public void method() {
        System.out.println("Path: " + path);
    }
}

0

I modi migliori per ottenere i valori delle proprietà stanno usando.

1. Utilizzo dell'annotazione valore

@Value("${property.key}")
private String propertyKeyVariable;

2. Utilizzo del bean Enviornment

@Autowired
private Environment env;

public String getValue() {
    return env.getProperty("property.key");
}

public void display(){
  System.out.println("# Value : "+getValue);
}

0

La cosa migliore è usare l' @Valueannotazione che assegnerà automaticamente valore al tuo oggetto private Environment en. Ciò ridurrà il tuo codice e sarà facile filtrare i tuoi file.


0

Ci sono due modi,

  1. puoi usarlo direttamente @Valuenella tua classe
    @Value("#{'${application yml field name}'}")
    public String ymlField;

O

  1. Per renderlo pulito puoi pulire la @Configurationclasse dove puoi aggiungere tutto il tuo@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.