Cara mengakses nilai yang ditentukan dalam file application.properties di Spring Boot

312

Saya ingin mengakses nilai yang disediakan application.properties, misalnya:

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

userBucket.path=${HOME}/bucket

Saya ingin mengakses userBucket.pathdi program utama saya di aplikasi Boot Spring.

Qasim
sumber

Jawaban:

467

Anda dapat menggunakan @Valueanotasi dan mengakses properti di mana kacang Spring yang Anda gunakan

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

Bagian Konfigurasi Eksternalisasi dari Boot Spring docs, menjelaskan semua detail yang mungkin Anda butuhkan.

Tuan Budak
sumber
5
sebagai alternatif kita bisa mendapatkan mereka juga dari musim semi Environmentatau melalui@ConfigurationProperties
sodik
3
Untuk menambahkan di atas jawaban @ sodik, ini adalah contoh yang menunjukkan cara mendapatkan Lingkungan stackoverflow.com/questions/28392231/…
cristi
Bagaimana jika Anda perlu mengakses lebih dari 10 nilai, Apakah Anda harus terus mengulangi contoh Anda 10 kali?
Jesse
satu pendekatan adalah dengan melakukannya, tetapi rumit. Ada pendekatan alternatif berdasarkan @Configurationkelas, masalah dianalisis dengan baik di posting blog
Master Slave
2
Catatan, ini hanya bekerja pada @Component(atau salah satu turunannya, yaitu @Repository, dll.)
Janac Meena
211

Cara lain adalah menyuntikkan org.springframework.core.env.Environmentkacang Anda.

@Autowired
private Environment env;
....

public void method() {
    .....  
    String path = env.getProperty("userBucket.path");
    .....
}
Rodrigo Villalba Zayas
sumber
6
juga berguna ketika nama properti yang Anda butuhkan untuk mengakses perubahan secara dinamis
Paulo Merson
3
Bagaimana jika Anda ingin mencari properti? Dan bolehkah saya menyarankan menyertakan pernyataan impor sehingga semua dapat melihat nama paket Lingkungan, mungkin org.springframework.core.env.Environment
chrisinmtown
2
Berhati-hatilah untuk tidak mengimpor Lingkungan yang salah. Saya intellij mengimpor Lingkungan CORBA secara otomatis.
Janac Meena
3
Mengapa id saya batal?
Janac Meena
2
@JanacMeena memiliki masalah yang sama dengan IntelliJ yang mengimpor otomatis kelas CORBA dan bukannyaorg.springframework.core.env.Environment
Rasshu
31

@ConfigurationPropertiesdapat digunakan untuk memetakan nilai dari .properties( .ymljuga didukung) ke POJO.

Pertimbangkan contoh file berikut ini.

.properti

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
}

Sekarang nilai properti dapat diakses dengan autowiring employeePropertiessebagai berikut.

@Autowired
private Employee employeeProperties;

public void method() {

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

}
JoBⅈN
sumber
1
saya menggunakan cara ini dan mendapat pengembalian nol, saya meletakkan file properti saya di src / test / resources dan properti kelas java (di mana nilai properti diselamatkan) di src / main / package / properties. apa yang saya lewatkan? terima kasih
Ahmad Leo Yudanto
Anda harus menyimpan file src/main/resourcesjika Anda tidak menguji kode Anda dari uji Spring.
JoBⅈN
Sama seperti @AhmadLeoYudanto dan tidak ada yang bisa saya lakukan untuk mengubahnya
Dimitri Kopriwa
6

Saat ini, saya tahu tentang tiga cara berikut:

1. @ValueAnotasi

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • Dalam pengalaman saya ada beberapa situasi ketika Anda tidak bisa mendapatkan nilai atau diatur ke null. Misalnya, ketika Anda mencoba mengaturnya dalam suatu preConstruct()metode atau init()metode. Ini terjadi karena injeksi nilai terjadi setelah kelas dibangun sepenuhnya. Inilah sebabnya mengapa lebih baik menggunakan opsi 3rd.

2. @PropertySourceAnotasi

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

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySoucemenetapkan nilai dari file sumber properti dalam Environmentvariabel (di kelas Anda) saat kelas dimuat. Jadi, Anda dapat mengambil kata penutup dengan mudah.
    • Dapat diakses melalui variabel Lingkungan Sistem.

3. @ConfigurationPropertiesAnotasi.

  • Ini sebagian besar digunakan dalam proyek Spring untuk memuat properti konfigurasi.
  • Ini menginisialisasi entitas berdasarkan data properti.

    • @ConfigurationProperties mengidentifikasi file properti untuk dimuat.
    • @Configuration membuat kacang berdasarkan variabel file konfigurasi.
    @ConfigurationProperties (awalan = "pengguna")
    @ Konfigurasi ("UserData")
    pengguna kelas {
      // Properti & pengambil / penyetel mereka
    }
    
    @ Diakui
    private UserData userData;
    
    userData.getPropertyName ();
Dhwanil Patel
sumber
Bagaimana jika lokasi default ditimpa spring.config.location? Apakah # 2 masih berfungsi?
bmauter
Dalam hal demikian, prioritas datang ke tempatnya. Seperti yang saya tahu ketika Anda mengatur spring.config.location menggunakan baris perintah memiliki prioritas tinggi sehingga menimpa yang sudah ada.
Dhwanil Patel
5

Anda dapat melakukannya dengan cara ini juga ....

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

    @Autowired
    private Environment env;

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

Lalu di mana pun Anda ingin membaca dari application.properties, cukup kirimkan kunci ke metode getConfigValue.

@Autowired
ConfigProperties configProp;

// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port"); 
korek
sumber
1
Paket apa itu Environment?
e-info128
1
Temukan di sini: org.springframework.core.env.Environment
lucifer
Bagaimana jika lokasi default ditimpa spring.config.location?
bmauter
3

Anda dapat menggunakan @Valueuntuk memuat variabel dariapplication.properties jika Anda akan menggunakan nilai ini di satu tempat, tetapi jika Anda memerlukan cara yang lebih terpusat untuk memuat variabel ini @ConfigurationPropertiesadalah pendekatan yang lebih baik.

Selain itu Anda dapat memuat variabel dan melemparkannya secara otomatis jika Anda memerlukan tipe data yang berbeda untuk melakukan validasi dan logika bisnis Anda.

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

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

ikuti langkah ini. 1: - buat kelas konfigurasi Anda seperti di bawah ini yang dapat Anda lihat

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: - ketika Anda memiliki kelas konfigurasi kemudian menyuntikkan dalam variabel dari konfigurasi di mana Anda butuhkan.

@Component
public class YourService {

    @Autowired
    private String getUserBucketPath;

    // now you have a value in getUserBucketPath varibale automatically.
}
Fazle Subhan
sumber
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"));
sai
sumber
1

Aplikasi dapat membaca 3 jenis nilai dari file application.properties.

properti aplikasi


     my.name=kelly

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

file kelas

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

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

Jika Anda tidak memiliki properti di application.properties maka Anda dapat menggunakan nilai default

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

Spring-boot memungkinkan kami beberapa metode untuk memberikan konfigurasi eksternal, Anda dapat mencoba menggunakan file application.yml atau yaml sebagai ganti file properti dan menyediakan pengaturan file properti yang berbeda sesuai dengan lingkungan yang berbeda.

Kami dapat memisahkan properti untuk setiap lingkungan menjadi file yml terpisah di bawah profil pegas yang terpisah. Kemudian selama penerapan Anda dapat menggunakan:

java -jar -Drun.profiles=SpringProfileName

untuk menentukan profil pegas mana yang akan digunakan. Perhatikan bahwa file yml harus berupa nama

application-{environmentName}.yml

bagi mereka untuk secara otomatis diambil oleh springboot.

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

Untuk membaca dari file application.yml atau properti:

Cara termudah untuk membaca nilai dari file properti atau yml adalah dengan menggunakan anotasi pegas @ nilai. Memutar secara otomatis memuat semua nilai dari yml ke lingkungan pegas, sehingga kami dapat langsung menggunakan nilai-nilai itu dari lingkungan seperti:

@Component
public class MySampleBean {

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

// ...

}

Atau metode lain yang disediakan pegas untuk membaca kacang yang sangat diketik adalah sebagai berikut:

YML

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

POJO yang sesuai untuk membaca 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) { ... }
    }
}

Metode di atas berfungsi baik dengan file yml.

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

Ananthapadmanabhan
sumber
0

Bagi saya, tidak satu pun di atas yang secara langsung bekerja untuk saya. Apa yang saya lakukan adalah sebagai berikut:

Selain @Rodrigo Villalba Zayas menjawab di sana saya menambahkan
implements InitializingBeanke kelas
dan menerapkan metode

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

Sehingga akan terlihat seperti

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);
    }
}
Rapalagui
sumber
0

Cara terbaik untuk mendapatkan nilai properti gunakan.

1. Menggunakan anotasi Nilai

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

2. Menggunakan kacang Enviornment

@Autowired
private Environment env;

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

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

Yang terbaik adalah menggunakan @Valueanotasi karena secara otomatis akan memberikan nilai pada objek Anda private Environment en. Ini akan mengurangi kode Anda dan akan mudah untuk memfilter file Anda.

MindFlayerA
sumber
0

Ada dua cara,

  1. Anda bisa langsung menggunakannya @Valuedi kelas Anda
    @Value("#{'${application yml field name}'}")
    public String ymlField;

ATAU

  1. Untuk membuatnya bersih, Anda dapat membersihkan @Configurationkelas di mana Anda dapat menambahkan semua@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
Rishabh Agarwal
sumber