File Spring .properties: dapatkan elemen sebagai Array

94

Saya memuat atribut properti dari .propertiesfile menggunakan Spring sebagai berikut:

file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6

File pegas xml

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>

Dan Class.java saya

file: Class.java
public void setProperty(final List<Integer> elements){
    this.elements = elements;
}

Namun saat debugging, elemen parameter hanya memasukkan elemen terakhir ke dalam daftar, jadi, ada daftar satu elemen dengan nilai "6", bukan daftar dengan 6 elemen.

Saya mencoba pendekatan lain, seperti menambahkan nilai saja #{base.module}tetapi kemudian tidak menemukan parameter di file properti.

Solusinya adalah memiliki dalam file elements.properties daftar yang dipisahkan dengan koma, seperti:

base.module.elementToSearch=1,2,3,4,5,6

dan menggunakannya sebagai String dan menguraikannya, tetapi apakah ada solusi yang lebih baik?

RamonBoza
sumber
jadi saya harus meneruskannya sebagai string yang dipisahkan koma dan metode parse.
RamonBoza
Tepatnya, meskipun ada beberapa lib yang telah melakukannya untuk Anda (apache commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert
Inilah jawaban yang setidaknya memberi Anda hasil Set <String>. Bukan List <String> yang cukup, tapi mungkin cukup dalam banyak kasus! stackoverflow.com/questions/5274362/…
John Rix

Jawaban:

194

Jika Anda mendefinisikan array Anda dalam file properti seperti:

base.module.elementToSearch=1,2,3,4,5,6

Anda dapat memuat array seperti itu di kelas Java Anda seperti ini:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
svlada
sumber
5
Elemen saya mengandung koma. Bagaimana cara saya keluar dari pemisah? '\,' even '\\,' tidak berfungsi.
banterCZ
Anda dapat mencoba menjadikannya sebagai daftar integer dan kemudian mengubahnya @Value ("$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Gal Bracha
+1, yang saya butuhkan. Sayangnya, membaca nilai yang dipisahkan koma menjadi a List<String>dengan cara yang sama tampaknya tidak berhasil (daftar hanya akan memiliki satu elemen).
Jonik
5
Saya dapat mengonfirmasi bahwa menggunakan String[]sebagai tipe berfungsi, di mana penggunaan List<String>tidak berfungsi.
Wim Deblauwe
3
Jika Anda ingin ini berfungsi, List<String>bukan dengan String[], Anda perlu menambahkan setidaknya a <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">ke file applicationContext.xml. Jika tidak, layanan konversi tidak digunakan tetapi editor properti default, yang tidak mendukung konversi Strings menjadi koleksi, hanya array: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar
37

Dan jika Anda memiliki pembatas yang berbeda selain koma, Anda juga dapat menggunakannya.

@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues;   // could also be a List<String>

dan

di properti aplikasi Anda, Anda dapat memiliki

my.config.values=value1, value2, value3
RK Punjal
sumber
penggunaan ini juga berfungsi dengan anotasi lain, saya menggunakan seperti @KafkaListener {topics = "# {'$ {ArrayProperty}'. split (',')}"} untuk pendengar kafka musim semi
AsyncTask
32

Berikut adalah contoh bagaimana Anda dapat melakukannya di Spring 4.0+

application.properties kandungan:

some.key=yes,no,cancel

Kode Java:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);
Juha Hanka
sumber
ini yang saya inginkan, tetapi di env vars ... saya seharusnya bisa menggunakan SOME_KEY_0_ = yes SOME_KEY_1 = no, etc di env vars, tapi getProperty saya kembali null
Rhubarb
1

Dengan Spring Boot seseorang dapat melakukan hal berikut:

application.properties

values[0]=abc
values[1]=def

Kelas konfigurasi

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@ConfigurationProperties
public class Configuration {

    List<String> values = new ArrayList<>();

    public List<String> getValues() {
        return values;
    }

}

Ini diperlukan, tanpa kelas ini atau tanpa valueskelas dalam itu tidak akan berfungsi.

Kelas Aplikasi Spring Boot

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;

@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {

    private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);

    // notice #{} is used instead of ${}
    @Value("#{configuration.values}")
    List<String> values;

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

    @Override
    public void run(String... args) {
        LOG.info("values: {}", values);
    }

}
Betlista
sumber
0

Jika Anda ingin melewatkan simbol asterisk, Anda harus membungkusnya dengan tanda kutip.

Dalam kasus saya, saya perlu mengkonfigurasi cors untuk websockets. Jadi, saya memutuskan untuk memasukkan url cors ke application.yml. Untuk prod env saya akan menggunakan url khusus, tetapi untuk dev tidak masalah menggunakan *.

Dalam file yml saya punya:

websocket:
  cors: "*"

Di kelas Config saya memiliki:

@Value("${websocket.cors}")
private String[] cors;
Ruslan Sheremet
sumber