2016-04-22 5 views
0

Mit SnakeYAML des TypeDescription kann ich Art Informationen über Listen hinzufügen und Maps:SnakeYAML: Wie zum Laden Bean-Eigenschaft Typen einzustellen

TypeDescription td = new TypeDescription(MyBean.class, "!mybean"); 
td.putMapPropertyType("mymap", String.class, MyOtherBean.class); 
td.putListPropertyType("mylist", MyOtherBean.class); 

Auf diese Weise ich Kollektionen mit Instanzen von MyOtherBean ohne bevölkern können verlassen auf anderen tags:

--- 
!mybean 
mymap: 
    foobar: # will map to an instance of MyOtherBean 
    otherbeanprop1: foo 
    otherbeanprop2: bar 
mylist: # will contain instances of MyOtherBean 
    - otherbeanprop1: foo 
    otherbeanprop2: bar 

gibt es eine einfache Möglichkeit, so etwas zu tun:

td.putPropertyType("myotherbean", MyOtherBean.class); 

, so dass die Eigenschaft myotherbean in MyBean würde mit einer einzigen Instanz von MyOtherBean bestückt werden? Dinge, die ich versuche zu vermeiden:

  • setzen zusätzliche Tags (wie !myotherbean) in der YAML-Datei
  • die anderen Bohnen Eigenschaften aus einer Karte zu laden und den Aufbau der Bohne selbst

ich bereits gespielt haben um mit diesem und ich glaube, ich brauche einen benutzerdefinierten Konstruktor wie folgt (von der SnakeYAML Dokumentation angepasst) zu erstellen:

class SelectiveConstructor extends Constructor { 
    public SelectiveConstructor() { 
     // define a custom way to create a mapping node 
     yamlClassConstructors.put(NodeId.mapping, new ConstructMapping() { 
      @Override 
      protected Object constructJavaBean2ndStep(MappingNode node, Object object) { 
       Class type = node.getType(); 
       if (type.equals(MyBean.class)) { 
        // something 
        if (propertyname.equals("myotherbean")) { 
         // something 
        } 
       } else { 
        // redirect creation to Constructor 
        return super.constructJavaBean2ndStep(node, object); 
       } 

     } 
    } 
} 

Das Problem i Ich verstehe nicht wirklich, was genau dort vor sich geht. Bitte lassen Sie mich wissen, wenn es einen einfacheren Weg gibt. Und wenn nicht, würde ich es begrüßen, wenn Sie Ihre Erfahrung damit teilen würden.

Antwort

1

Es gibt eine elegante Möglichkeit, dies zu tun.
Wenn Sie nicht einige spezielle Tricks mit dem YAML Inhalt tun möchten, können Sie die folgenden zwei Methoden der SnakeYAML verwenden, um Dump und Last yaml Inhalt:

public String dumpAsMap(Object data)    // dump method 
public <T> T loadAs(Reader io, Class<T> type)  // load method 

In Ihrem Szenario

dump:

MyBean bean = new MyBean(); 
// init bean... 
String yamlContent = yaml.dumpAsMap(bean); 

Last:

FileReader reader = new FileReader(filename); 
MyBean bean = yaml.loadAs(reader, MyBean.class); 

Natürlich sollten Sie den Getter und Setter Ihrer Klassen implementieren. Für Details können Sie sich hier die example ansehen.

Verwandte Themen