@XmlSeeAlso не работает для того же корневого узла
Я пытаюсь реализовать наследование с @XmlSeeAlso
аннотаций. Все работает как положено при использовании разных имен корневых узлов для подклассов. Но с одинаковыми корневыми именами Unmarshaller всегда выбирает последний класс из списка XmlSeeAlso, независимо от содержимого. Невозможно изменить корневые имена. Есть ли способ заставить Unmarshaller правильно выбирать класс по содержанию?
import java.io.ByteArrayInputStream;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.transform.stream.StreamSource;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
public class Test {
public static void main(String[] args) {
Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
unmarshaller.setClassesToBeBound(Parent.class);
System.out.println(unmarshaller.unmarshal(new StreamSource(
new ByteArrayInputStream("<value><a>AAA</a><b>BBB</b></value>"
.getBytes()))));
System.out.println(unmarshaller.unmarshal(new StreamSource(
new ByteArrayInputStream("<value><c>CCC</c><d>DDD</d></value>"
.getBytes()))));
}
@XmlSeeAlso({ ChildAB.class, ChildCD.class })
public static abstract class Parent {
}
@XmlRootElement(name = "value")
public static class ChildAB {
@XmlElement(name = "a")
private String a;
@XmlElement(name = "b")
private String b;
@Override
public String toString() {
return "ChildAB[" + a + "; " + b + "]";
}
}
@XmlRootElement(name = "value")
public static class ChildCD {
@XmlElement(name = "c")
private String c;
@XmlElement(name = "d")
private String d;
@Override
public String toString() {
return "ChildCD[" + c + "; " + d + "]";
}
}
}
Выход:
ChildCD[null; null]
ChildCD[CCC; DDD]
1 ответ
Почему ваш класс ChildAB и ChildCD статичны? Также ChildAB и ChildCD должны реализовать / расширить ваш родительский класс.