it-swarm.com.de

Spring Boot-Eigenschaft Yml/Eigenschaften mit Listenstruktur

Ich habe im ganzen stackoverflow und im Netz nach einer Lösung dafür gesucht. Keine Lösung, die ich gesehen habe, funktioniert, weil möglicherweise keiner der Beiträge genau zu meinem Anwendungsfall passt, der eine Liste in der Datei und auch eine Objektstruktur enthält. 

Hier ist eine Probe als Yaml

teddy.list:
    -
      name: Red
      price: Five
    -
      name: Blue
      price: One
    -
      name: Yellow
      price: Two
    -
      name: Green
      price: Three

Hier ist das gleiche Beispiel wie eine Eigenschaftsdatei

teddy.list[0].name=Red
teddy.list[0].price=Five
teddy.list[1].name=Blue
teddy.list[1].price=One
teddy.list[2].name=Yellow
teddy.list[2].price=Two
teddy.list[3].name=Green
teddy.list[3].price=Three

Ich möchte meiner Anwendung eine Datei teddy.yml oder teddy.properties zur Konfiguration bereitstellen können.

Hier ist meine Klasse dafür:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource(name = "props", value = "classpath:teddy.yml", ignoreResourceNotFound = false)
@ConfigurationProperties(prefix = "teddy")
public class TeddyBearConfig {

    @Autowired
    Environment env;

    @Value("${teddy.list}")
    private TeddyBear[] teddyBears;

    public TeddyBear[] getTeddyBears() {
        return teddyBears;
    }

    public void setTeddyBears(TeddyBear[] teddyBears) {
        this.teddyBears = teddyBears;
    }

    public static class TeddyBear {
        private String name;
        private String price;

        public TeddyBear() {

        }

        public TeddyBear(String name, String price) {
            this.name = name;
            this.price = price;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPrice() {
            return price;
        }

        public void setPrice(String price) {
            this.price = price;
        }
    }
}

Ich habe dieses Setup ausprobiert, indem ich mit der Umgebung versuchte, auf die Eigenschaften zuzugreifen, das Präfix zu entfernen und eine Bean von "PropertySourcesPlaceholderConfigurer" zu deklarieren.

Mit dem aktuellen Code wirft spring eine IllegalStateException, da Java.lang.string nicht in meine TeddyBear-Klasse konvertiert werden kann.

3
GSUgambit

Das sollte funktionieren. 

@Configuration
@PropertySource(name = "props", value = "classpath:teddy.properties", ignoreResourceNotFound = false)
@ConfigurationProperties(prefix = "teddy")
public class TeddyBearConfig {

  private List<TeddyBear> list;

  public List<TeddyBear> getList() {
    return list;
  }

  public void setList(List<TeddyBear> list) {
    this.list = list;
  }

  public static class TeddyBear {
    private String name;
    private String price;

    public TeddyBear() {

    }

    public TeddyBear(String name, String price) {
      this.name = name;
      this.price = price;
    }

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public String getPrice() {
      return price;
    }

    public void setPrice(String price) {
      this.price = price;
    }
  }
}

Update

Der obige Code funktioniert für die oben angegebene Eigenschaftendatei.
Wenn Sie eine Yml-Datei verwenden möchten, können Sie dies tun. aber es gibt ein paar punkte.
1. Ihre Yml-Struktur ist nicht korrekt, es sollte so sein 

teddy:
  list:
    -
      name: Red
      price: Five
    -
      name: Blue
      price: One
    -
      name: Yellow
      price: Two
    -
      name: Green
      price: Three

2. Nachdem Sie Ihre yml-Struktur (und auch den Dateinamen in Ihrer TeddyBearConfig) korrigiert haben, werden Sie feststellen, dass springboot während des Startvorgangs keine Beanstandungen verursacht. Dies ist ein Fehler in der Art, wie Springboot Yml-Dateien durch @PropertySource verarbeitet. 

3.Wenn Sie diesen Yml-Inhalt nach application.yml verschieben und @PropertySource-Zeile in Ihrer Konfigurationsdatei entfernen, werden Sie feststellen, dass alles einwandfrei funktioniert.

2
pvpkiran

Da Sie ConfigurationProperties Annotation anstelle von verwenden

@Value("${teddy.list}")
private TeddyBear[] teddyBears;

Das kannst du direkt machen

private List<TeddyBear> list;

Keine @Value-Anmerkung erforderlich. 

Außerdem muss der Variablenname list sein, da Sie dies in yml angegeben haben.

0
Yogesh Badke