2016-08-29 2 views
1

Angenommen, ich habe diese application.yml definiert:Wie man komplexe Liste für Anwendung Yml im Frühling boot definiert?

spring: 
    profiles.active: development 
--- 
spring: 
    profiles: development 
logging: 
    level: 
     org.springframework.web: DEBUG 
     org.hibernate: ERROR 
storage: 
    RemoteStorage: 
     name: "Server 1" 
     user: "test" 
     passwd: "test" 
     host: "163.218.233.106" 

    LocalStorage: 
     name: "Server 2" 
     user: "test2" 
     passwd: "test2" 
     host: "10.10.0.133" 
--- 

Die storage ist eine benutzerdefinierte Eigenschaften, die ich es Last so sein wollen:

@Value("${storage}") 
private List<Storage> AvailableStorage = new ArrayList<>(); 

Apologies ich ein Anfänger mit Spring-Framework bin. Was ich versuchte zu tun, ist die RestController gelesene entsprechende Konfiguration basierend auf den Parametern von Anfragen, d. H. Anforderungen wie ?storage=RemoteStorage wird die RemoteStorage Konfig verwenden.

Antwort

1

@Value Annotation wird keine Listen- oder Map-Eigenschaften laden. Dazu müssen Sie eine Klasse mit @ConfigurationProperties Annotation wie unten definieren.

import java.util.List; 
import java.util.Map; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ConfigurationProperties(prefix ="storage") 
public class MyProps { 

private List<String> listProp; 
private Map<String, String> mapProp; 

public List<String> getListProp() { 
    return listProp; 
} 
public void setListProp(List<String> listProp) { 
    this.listProp = listProp; 
} 
public Map<String, String> getMapProp() { 
    return mapProp; 
} 
public void setMapProp(Map<String, String> mapProp) { 
    this.mapProp = mapProp; 
    } 
} 

Und unten ist die application.yaml Datei für die obige Eigenschaft Konfigurationsklasse.

storage: 
listProp: 
    - listValue1 
    - listValue2 
mapProp: 
    key1: mapValue1 
    key2: mapValue2 

Wenn Sie die application.properties verwenden statt .yaml Datei Datei dann

storage.listProp[0]=listValue1 
storage.listProp[1]=listValue2 
storage.mapProp.key1=mapValue1 
storage.mapProp.key2=mapValue2 
+0

Um also in yml definiert mehrere Server zu haben. Ich kann es nicht wie den in der Frage definieren. Stattdessen muss ich eine Liste haben, wie ein Zeiger auf verschiedene 'mapProp' zeigt? Aus Ihrem Beispiel sieht es so aus, als ob ich etwas mehrdeutige 'getMapProp1',' getMapProp2' usw. für mehrere Server in 'MyProps' definiere. – user1510539

+0

.yaml-Einträge sind nichts als Eigenschaftsschlüsselwerte. Bitte überprüfen Sie oben. Ich habe hinzugefügt, wie die Einträge im Falle von application.properties aussehen werden. In Ihrem Fall haben Sie also localStorage und remoteStorage map definiert. Wenn Sie Beans basierend auf der Umgebung laden möchten, können Sie @ConditionalOnProperty verwenden. Überprüfen Sie http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html#boot-features-property-conditions – abaghel

+0

Hmm, ich dachte, es wäre eine Möglichkeit, Werte Klassen zuzuordnen. Aber das ist in Ordnung, ich könnte es immer noch mit deiner Herangehensweise abbilden. Vielen Dank:) – user1510539

Verwandte Themen