2017-11-02 3 views
0

Ich habe versucht, meinen Kopf für Stunden, aber es macht nicht viel Sinn, was ich falsch mache. Ich versuche, ein Map-Objekt in Java aus einer .yml-Datei zu erstellen. Grund ist für eine Karte, ich weiß nicht, was/wie viele Kinder unter "Gegenwart" erscheinen, also habe ich lieber eine dynamische Möglichkeit, ein Kartenobjekt daraus zu erstellen.Lesen yaml config

Unten ist meine .yml-Datei . Ich würde das Schlüssel-Wert-Paar wie unter „present“:

present: 
    now: LOCAL TESTING 
    later: testing 

Unten ist meine Config-Klasse (alles auf Kommentar ist, was ich versucht habe - in verschiedenen Kombinationen):

//@Data 
@Component 
@EnableConfigurationProperties 
@ConfigurationProperties(prefix = "present") 
//@ConfigurationProperties 
public class stat { 

    //@Getter 
    //@Data 
    @Value("${present}") 
    private Map<String, String> present; 
    //private Map<String, String> present = new HashMap<String, String>(); 

} 

Ich habe versucht, Andere SO-Posts ansehen und ich habe das Gefühl, dass ich es verstehe, aber meine Anwendung Spring Boot (v1.5.8) sieht diesen Wert nicht. Es wirft fortwährend einen Fehler für mich auf oder das Kartenobjekt ist Null (oder wird nicht gefüllt).

Ich weiß, dass ich Werte aus dieser .yml Datei lesen kann, weil, wenn ich versuche, unten einen einzelnen Wert mit einem Code-Schnipsel zu erhalten, es funktioniert:

@Data 
@Value("${present.now}") 
private String status; // String value "LOCAL TESTING" 

Hier sind die anderen Links, die ich habe versucht:

Spring Boot yaml configuration for a list of strings

how to convert yml file to java pojo

Bin ich etwas fehlt offensichtlich? Vielen Dank!

Antwort

0

Sie können versuchen, ein POJO zu erstellen, um die Yml-Struktur darzustellen, aus der Sie zu lesen versuchen.

Zum Beispiel:

@Configuration 
@ConfigurationProperties(prefix = "present") 
@Data 
public class Present { 

    private String now; 

    private String later; 
} 
+0

Danke für diese Antwort, aber ich versuche, ein Kartenobjekt daraus zu erstellen.Etwas, das ich in der ursprünglichen Frage nicht erwähnte, war, dass ich die Kinder nicht kenne (abgesehen davon, dass es keine doppelten Schlüssel geben wird), das heißt, ich erstelle lieber ein POJO, das Kartenobjekte dynamisch erstellen kann, anstatt diese Werte hart zu codieren . – rj2700

0

Also habe ich es aus (für diejenigen, die später dieses Problem haben):

@Value ist nicht erforderlich und das Präfix param in den @ConfigurationProperties ist nicht erforderlich.

Dann müssen Sie eine Getter-Methode für die Felder haben, die Sie möchten - ich dachte, die Lombok-Bibliothek hatte diese automatisch generiert, aber ich lag falsch (wahrscheinlich später mehr darüber lesen - @Setter und @Data wird nicht funktionieren richtig).

So sollte es in etwa so aussehen:

@Component 
@EnableConfigurationProperties 
@ConfigurationProperties 
public class stat { 

    private Map<String, String[]> present = new HashMap<String, String[]>(); 

    public Map<String, String[]> getPresent() { 
     return present; 
    } 
} 

Lassen Sie uns nun ein komplexeres Beispiel (verschachtelte Karten) geben. Sagen, dass meine .yml Datei wie folgt aussieht:

parent: 
    present: 
     foo: dey, tok 
     bar: ar, jerbs 
    later: 
     foo: day, dok 
     mar: r, darbs 

Die POJO würde wie folgt aussehen:

@Component 
@EnableConfigurationProperties 
@ConfigurationProperties 
public class stat { 

    private Map<String, Map<String, String[]>> parent = new HashMap<String, Map<String, String[]>>(); 

    public Map<String, Map<String, String[]>> getParent() { 
     return parent; 
    } 
} 

Eine weitere wichtige Sache zu beachten ist, dass das Feld, das Sie von Wert sind, zu erhalten muss das Match Variablenname - es spielt keine Rolle, ob Sie ein Präfix verwenden, aber es funktionierte immer noch nicht für mich. Hoffe das hilft.