Dizelerin listesi için Spring Boot yaml yapılandırması


149

Application.yml dosyasından dizeleri bir dizi yüklemeye çalışıyorum. Bu yapılandırma:

ignore:
    filenames:
        - .DS_Store
        - .hg

Bu sınıf:

@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();

Aynı sınıfta iyi yüklenen başka yapılandırmalar da vardır. Yaml dosyamda hiç sekme yok. Yine de aşağıdaki istisnayı alıyorum:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"

Yanıtlar:


71

Benim tahminim yani, @Value"kompleks" türleri ile başa çıkamaz. Bunun gibi bir prop sınıfı ile gidebilirsiniz:

@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
    List<String> filenames
}

Lütfen not: Bu kodu Groovy - Java değil örnek kısa tutmak için -! Nasıl benimseneceğine dair ipuçları için yorumlara bakın.

Tüm örneğe bakın https://github.com/christoph-frick/so-springboot-yaml-string-list


1
Virgülle ayrılmış olarak bağlayabilirsiniz @Value(bir dönüştürücü kaydedildiği sürece, sanırım Spring Boot'da olacak).
Dave Syer

2
Dize ayarlarını alıyor ancak <String> ayarlarını listelemiyor
Bahadır Yağan

1
Çalışmak için alamadım @Configuration, ancak @Componentbunun yerine hile yaptı.
Stijn Van Bael

1
@cfrick evet yaptığım tek değişiklik buydu. Her iki ek açıklamanın amacına baktığımda @Component, daha uygun olduğunu söyleyebilirim : stackoverflow.com/questions/12229282/…
Stijn Van Bael

2
Bu, açıklama ekleyen
wontondon

134

application.yml içinde virgülle ayrılmış değerler kullanın

ignoreFilenames: .DS_Store, .hg

erişim için java kodu

@Value("${ignoreFilenames}")    
String[] ignoreFilenames

Çalışıyor ;)


Bu da Dropwizard çalışmak umuyordum: '(yine de teşekkürler!
RST

1
Bu en iyi cevap olmalıydı.
Mohamed Elsayed

3
Kendi testlerimde, bu ".DS_Store, .hg" ile eşdeğerdir, ancak ".DS_Store", ".hg" ile eşdeğer değildir - ikincisi "org.yaml.snakeyaml.parser.ParserException: bir blok eşlemesini ayrıştırırken" başarısız olur. Aslında burada yaptığınız şey, özelliği YAML dizisi yerine virgülle ayrılmış tek bir dize (bu da Spring bir dizi veya listeye böler) olarak sağlamaktır. Bu "işe yarıyor" ama asıl soruya cevap vermiyor. Henüz @Value açıklamalı fasulye özelliği bir YAML dizi ayrıştırmak için bir yol bulmak zorunda.
Zirzirikos

38

İlkbahar önyükleme belgelerinden https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

YAML listeleri [index] dereferencer'larıyla özellik anahtarları olarak temsil edilir, örneğin bu YAML:

my:
   servers:
       - dev.bar.com
       - foo.bar.com

Şu özelliklere dönüştürülecekti:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

Spring DataBinder yardımcı programlarını kullanarak (böyle bir şeydir @ConfigurationProperties) böyle özelliklere bağlanmak için , hedef çekirdek türünde bir özelliğe sahip olmanız gerekir java.util.Listve ya bir ayarlayıcı sağlamanız veya değiştirilebilir bir değerle başlatmanız gerekir; örneğin, bu bağlanır yukarıdaki özelliklere. İşte sorunun kodu şöyle görünecektir.

@ConfigurationProperties(prefix="ignore")
public class Filenames {

    private List<String> ignoredFilenames = new ArrayList<String>();

    public List<String> getFilenames() {
        return this.ignoredFilenames;
    }
}

2
Bu BTW, çalışıyor olması gerekir getXxx()işe bunun için gereklidir ve bir kullanmalıdır Listdeğil Set.
Eric Wang

Yaml dosyasında, ArrayList için değer listesi virgülle ayrılmış bir liste olabilir. Benim durumumda, birçok değerim var, bu yüzden kompakt bir liste satır başına bir öğeden daha temiz. Yani örnekte, sunucular yapabilirsiniz: dev.bar.com, foo.bar.com
Violaman

Yaml böyle bir özellikleri dosyadan yüklenecek misiniz: servers: ${my.servers}? Almak my.servers[0]ve my.servers[1]yaml içine? Sahneye bağımlı yapılandırmalar yapmaya çalışıyorum
ochs.tobi

25

Ahmet'in cevabına ek olarak , koma ile ayrılmış dizeye >sembolünü kullanarak satır sonları ekleyebilirsiniz .

application.yml :

ignoreFilenames: >
  .DS_Store, 
  .hg

Java kodu :

@Value("${ignoreFilenames}")    
String[] ignoreFilenames;

Bu, dizelerinizde daha fazla virgül (,) bulunmadığı sürece işe yarar.
Valentin Despa

Bu, özellikleri arraylist olarak okumak için çalışmaz. Onları tek String olarak okur.
Sree Lakshmi

6

Ahmet'in yanıtı , String dizisine virgülle ayrılmış değerlerin nasıl atanacağını sağlar.

Yukarıdaki yapılandırmayı farklı sınıflarda kullanmak için bunun için alıcılar / ayarlayıcılar oluşturmanız gerekebilir. Ancak bu yapılandırmayı bir kez yüklemek ve bunu Autowired ek açıklamasıyla bir fasulye olarak kullanmaya devam etmek istiyorsanız, işte nasıl başardım:

ConfigProvider.java içinde

@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
    return new ArrayList<String>();
}

Dış sınıflarda:

@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;

otomatik kablolama ile aynı listeyi başka her yerde kullanabilirsiniz.


Bu işe yarıyor. Benim durumumda olsa da @Configuration, sınıfın başında eklemek sürece uygulama başarısız oldu ConfigProvider.java. Aksi takdirde Kaynak bulunamadı bulunamadı 'java.util.List' türü bir fasulye gerekli.
Diana

4
@Value("#{'${your.elements}'.split(',')}")  
private Set<String> stringSet;

yml dosyası:

your:
 elements: element1, element2, element3

Bahar spel ile oynayabileceğiniz çok daha fazlası var.


2

İşe yarayabildiğim tek şey şöyle:

servers: >
    dev.example.com,
    another.example.com

@Value("${servers}")
private String[] array;

Ve sınıfınızın üstündeki @ Yapılandırmayı unutmayın ...

"," Ayrılığı olmadan, böyle bir şans yok ...

Çok çalışıyor (önyükleme 1.5.8 sürümü)

servers: 
       dev.example.com,
       another.example.com

-1

Benim durumumda bu .yml dosyasında bir sözdizimi sorunu oldu. Sahiptim:

@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;

ve .yml dosyamdaki liste:

bootstrap-servers:
  - s1.company.com:9092
  - s2.company.com:9092
  - s3.company.com:9092

@ Değer ek açıklamalı alanına okuma yapmıyordu. .Yml dosyasındaki sözdizimini şöyle değiştirdiğimde:

bootstrap-servers >
  s1.company.com:9092
  s2.company.com:9092
  s3.company.com:9092

iyi çalıştı.


Bahar önyükleme 1.5 üzerinde denemek bu işe yaramaz. Bootstrap-sunucular sonra bir kolon gerekir
Taugenichts

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.