Spring .properties dosyası: bir Array olarak eleman al


94

.propertiesAşağıdaki gibi Spring kullanan bir dosyadan özellik özniteliklerini yüklüyorum :

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

Bahar xml dosyası

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

Ve benim Class.java

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

Ancak hata ayıklama sırasında, parametre öğeleri listedeki yalnızca son öğeyi alır, bu nedenle 6 öğeli bir liste yerine "6" değerine sahip bir öğe listesi vardır.

Yalnızca değer eklemek gibi diğer yaklaşımları denedim, #{base.module}ancak daha sonra özellikler dosyasında hiçbir parametre bulamadı.

Bir çözüm, elements.properties dosyasında virgülle ayrılmış bir listeye sahip olmaktır, örneğin:

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

ve bir String olarak kullanın ve ayrıştırın, ancak daha iyi bir çözüm var mı?



bu yüzden virgülle ayrılmış bir dize olarak geçirmem ve yöntemde ayrıştırmam gerekiyor.
RamonBoza

Kesinlikle, bunu sizin için halihazırda yapan bazı kütüphaneler olsa da (apache commons) - commons.apache.org/configuration/howto_properties.html
Colin Hebert

İşte size en azından bir Set <String> sonucu veren bir cevap. Tam olarak bir Liste <String> değil, ancak birçok durumda muhtemelen yeterli! stackoverflow.com/questions/5274362/…
John Rix

Yanıtlar:


194

Dizinizi özellikler dosyasında şöyle tanımlarsanız:

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

Böyle bir diziyi Java sınıfınıza şu şekilde yükleyebilirsiniz:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;

5
Öğelerim virgül içeriyor. Ayırıcıdan nasıl kaçarım? '\,' hatta '\\,' çalışmıyor.
banterCZ

Bunları tamsayı listesi olarak almayı deneyebilir ve sonra bunları @ Değer ("$ {base.module.elementToSearch}") özel Listesi <Integer> elementToSearch;
Gal Bracha

+1, tam da ihtiyacım olan şey. Maalesef virgülle ayrılmış değerleri List<String>aynı şekilde bir a'ya okumak işe yaramıyor gibi görünüyor (listede sadece bir öğe olacak).
Jonik

5
String[]Kullanmanın List<String>işe yaramadığı durumlarda tür olarak kullanmanın çalıştığını doğrulayabilirim .
Wim Deblauwe

3
List<String>Bunun yerine çalışmasını istiyorsanız String[], en azından a eklemeniz <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">gerekir applicationContext.xml. Aksi takdirde dönüştürme hizmeti kullanılmaz ancak Dizelerin koleksiyonlara dönüştürülmesini desteklemeyen varsayılan özellik düzenleyicileri, yalnızca diziler: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar

37

Ve virgül dışında farklı bir sınırlayıcı varsa, bunu da kullanabilirsiniz.

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

ve

uygulama özelliklerinizde sahip olabilirsiniz

my.config.values=value1, value2, value3

bu kullanım diğer ek açıklamalarla da çalışır, bahar kafka dinleyicisi için @KafkaListener {konular = "# {'$ {ArrayProperty}'. split (',')}"} gibi kullandım
AsyncTask

32

İşte bunu Spring 4.0+ sürümünde nasıl yapabileceğinize dair bir örnek

application.properties içerik:

some.key=yes,no,cancel

Java Kodu:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);

istediğim bu, ama ortam vars ... SOME_KEY_0_ = yes SOME_KEY_1 = hayır, vb. ortam değişkenlerinde kullanabilmeliyim, ancak getProperty'm geri geliyor
Rhubarb

1

Spring Boot ile aşağıdakiler yapılabilir:

application.properties

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

Yapılandırma sınıfı

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;
    }

}

Bu gereklidir, bu sınıf olmadan veya sınıf içi olmadan valuesişe yaramaz.

Spring Boot Uygulama sınıfı

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);
    }

}

0

Yıldız işaretini geçmeniz gerekiyorsa, onu tırnak içine almanız gerekir.

Benim durumumda, web soketleri için cors yapılandırmam gerekiyor. Bu yüzden cors url'leri application.yml'ye koymaya karar verdim. Prod env için belirli url'leri kullanacağım, ancak dev için sadece * kullanmakta sorun yok.

Yml dosyasında:

websocket:
  cors: "*"

Config sınıfında:

@Value("${websocket.cors}")
private String[] cors;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.