http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-using-substitution.html
я есть класс Animal и расширение Animal под названием AnimalExtension.
public class Animal
public class AnimalExtension extends Animal
Единственное различие между этими двумя классами состоит в том, что AnimalExtension имеет другую переменную экземпляра с именем animalId. У Animal нет этой переменной экземпляра.
У меня также есть свой собственный тип данных, который я хочу маршалировать и разархивировать в XML. Этот тип данных называется AnimalList. внутри AnimalList есть список Animals как переменная экземпляра.
@XmlType(name = "AnimalList")
public class AnimalList{
private List<Animal> animalList;
....
animalList может содержать как Animal, так и AnimalExtension. Однако в XML я не хочу, чтобы элемент назывался AnimalExtension; Я хочу, чтобы у всех них было имя элемента Animal. Я хочу, чтобы дополнительный атрибут отображался только тогда, когда JAXB знает, что Animal на самом деле является экземпляром AnimalExtension. Так что, если у меня есть список, который выглядит как
List<Animal> animalList = new LinkedList<Animal>();
AnimalExtension animalExtension = new AnimalExtension();
animalExtension.setAnimalId(1);
amimalExtension.setName("Don");
Animal animal = new Animal();
animal.setName("Mike");
animalList.add(animalExtension);
animalList.add(animal);
Я хочу, чтобы XML выглядел как
<AnimalList>
<Animal name="Don" id="1" />
<Animal name="Mike" />
</AnimalList>
Это то, что я пытался сделать
@XmlElements(
{
@XmlElement(name = "Animal", type = Animal.class),
@XmlElement(name = "Animal", type = AnimalExtension.class)
}
)
public List<Animal> getEntries() {
return animalList;
}
Код компилируется, но когда я пытаюсь запустить свой сервер. Это дает мне эту странную ошибку, которая так не связана с тем, что происходит (BeanCreationException). Я попытался сделать имя XmlElement различным для каждого типа, и это работает, но задача здесь состоит в том, чтобы сделать имя одинаковым.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'encryptionPayloadContentProvider'