2017-02-27 4 views
0

Pourquoi dans cet exemple la liste de bazes n'est pas unmarshalled correctement? Exemple résultats dans un seul Baz dans le ArrayList avec des propriétés null. Comment le faire fonctionner correctement?jaxb unmarshall liste fonctionne maintenant

public class Application { 

    private final static String FOO_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><FooBar><foo>foo</foo><bar>1</bar>" 
      + "<bazes><baz><baz1>baz11</baz1><baz2>baz12</baz2></baz><baz><baz1>baz21</baz1><baz2>baz22</baz2></baz></bazes>" 
      + "</FooBar>"; 

    public static void main(String[] args) throws JAXBException { 

     JAXBContext ctx = JAXBContext.newInstance(FooBar.class); 
     Unmarshaller u = ctx.createUnmarshaller(); 
     FooBar result = (FooBar) u.unmarshal(new ByteArrayInputStream(FOO_XML.getBytes())); 

     System.out.println(result); 
     System.out.println(result.bazes.size()); 
    } 

    @XmlRootElement(name = "FooBar") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public static class FooBar { 

     @XmlElement 
     private String foo; 
     @XmlElement 
     private int bar; 
     @XmlElement(name = "bazes") 
     public ArrayList<Baz> bazes; 

     @Override 
     public String toString() { 
      StringBuffer sb = new StringBuffer(); 
      sb.append(foo + " "); 
      sb.append(bar + " "); 
      for (Baz baz : bazes) { 
       sb.append(baz.baz1 + " " + baz.baz2 + " "); 
      } 
      return sb.toString(); 
     } 

     @XmlType 
     @XmlAccessorType(XmlAccessType.FIELD) 
     public static class Baz { 

      @XmlElement 
      private String baz1; 
      @XmlElement 
      private String baz2; 
     } 
    } 
} 

Le résultat suit

foo 1 null null 
1 

Répondre

1

Vous aurez besoin de spécifier l'objet d'emballage en utilisant @XmlElementWrapper et quelque chose comme ça

@XmlElementWrapper(name = "bazes") 
@XmlElement(name = "baz", type = Baz.class) 
public ArrayList<Baz> bazes; 
+0

Cela fonctionne parfaitement –