Ich versuche, eine Liste von Objekten zu erstellen, die eine gemeinsame Schnittstelle implementieren. Es gibt drei Klassen und 1-Schnittstelle beteiligt: Marshalling einer Liste von Objekten, die eine gemeinsame Schnittstelle implementieren, mit JaxB
Gemeinschaft Klasse (hat eine Methode: Liste <Person> getPeople();)
Person Schnittstelle (hat eine Methode: String getName();)
Mädchen Klasse (implementiert Person)
Junge Klasse (implementiert Person)
Siehe Code unten.
Ich möchte eine XML, die etwa wie folgt aussieht:
<community>
<people>
<girl>
<name>Jane</name>
</girl>
<boy>
<name>John</name>
</boy>
<girl>
<name>Jane</name>
</girl>
<boy>
<name>John</name>
</boy>
</people>
</community>
oder möglicherweise:
<community>
<people>
<person>
<girl>
<name>Jane</name>
</girl>
</person>
<person>
<boy>
<name>John</name>
</boy>
</person>
</people>
</community>
weit Also, was ich bekommen, ist dies:
<community>
<people>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl">
<name>Jane</name>
</person>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy">
<name>John</name>
</person>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl">
<name>Jane</name>
</person>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy">
<name>John</name>
</person>
</people>
</community>
Ich weiß, ich kann ändere das Element in etwas anderes, aber ich möchte, dass der Elementname der Name ist, der in der Girl- oder Boy-Klasse angegeben ist.
Kann dies getan werden? Vielen Dank.
@XmlRootElement(name = "community")
public class Community {
private List<Person> people;
@XmlElementWrapper
@XmlElement(name="person")
public List<Person> getPeople() {
return people;
}
public Community() {
people = new ArrayList<Person>();
people.add(new Girl());
people.add(new Boy());
people.add(new Girl());
people.add(new Boy());
}
}
@XmlRootElement(name = "girl")
public class Girl implements Person {
@XmlElement
public String getName() {
return "Jane";
}
}
@XmlRootElement(name = "boy")
public class Boy implements Person {
@XmlElement
public String getName() {
return "John";
}
}
@XmlJavaTypeAdapter(AnyTypeAdapter.class)
public interface Person {
public String getName();
}
public class AnyTypeAdapter extends XmlAdapter<Object, Object> {
@Override
public Object marshal(Object v) throws Exception {
return v;
}
@Override
public Object unmarshal(Object v) throws Exception {
return v;
}
}