JAXB @XmlElements, de différents types, mais le même nom?
J'ai un Animal de la classe et une extension de l'Animal appelé AnimalExtension.
public class Animal
public class AnimalExtension extends Animal
La seule différence entre les deux classes n'est que AnimalExtension a une autre variable d'instance appelée animalId. Les animaux n'ont pas cette variable d'instance.
J'ai aussi mon propre type de données que je veux maréchal et unamarshal à XML. Ce type de données est appelé AnimalList. à l'intérieur de AnimalList, il y a une liste des Animaux comme une variable d'instance.
@XmlType(name = "AnimalList")
public class AnimalList{
private List<Animal> animalList;
....
animalList peut contenir à la fois des Animaux et des AnimalExtension. Cependant, sur le XML je ne veux pas l'élément à être nommé comme AnimalExtension; je veux qu'ils aient tous le nom de l'élément de l'Animal. Je veux seulement l'attribut supplémentaire pour montrer quand JAXB sait que l'Animal est en fait une instance de AnimalExtension. Donc, si j'ai une liste qui ressemble à
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);
Je veux le XML pour ressembler à
<AnimalList>
<Animal name="Don" id="1" />
<Animal name="Mike" />
</AnimalList>
C'est ce que j'ai essayé de faire
@XmlElements(
{
@XmlElement(name = "Animal", type = Animal.class),
@XmlElement(name = "Animal", type = AnimalExtension.class)
}
)
public List<Animal> getEntries() {
return animalList;
}
Le code compile mais quand j'ai essayer de lancer mon serveur. Il me donne cette erreur bizarre c'est donc sans rapport avec ce qui se passe (BeanCreationException). J'ai essayé de faire au nom de la XmlElement différents pour chaque type et qui fonctionne, mais le défi ici est de rendre le nom de le même.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'encryptionPayloadContentProvider'
id
attribut? Que faire si il y avait autre classe nommée AnimalEnhacement
avec l'attribut id?bon point lol. il n'a pas penser que.
OriginalL'auteur denniss | 2011-02-15
Vous devez vous connecter pour publier un commentaire.
À la carte ce cas d'utilisation, vous pourriez tirer parti de la suite XmlAdapters:
AnimalAdapter
Depuis AnimalExtension est un super jeu de Animal nous allons l'utiliser pour produire/consommer XML. Ensuite, nous allons tirer parti de la valeur de la animalId propriété pour déterminer si une instance de l'Animal ou de AnimalExtension sera retourné à AnimalList.
IdAdapter
Nous avons besoin d'un deuxième XmlAdapter pour supprimer animalId si sa valeur est 0:
Votre modèle de classes seront annotées comme suit:
AnimalList
Animal
AnimalExtension
Le Code De Démonstration
La démonstration suivante de code peut être utilisé pour démontrer cette solution:
La sortie suivante s'affiche:
Informations Liées
Vous pouvez trouver les informations suivantes utiles:
OriginalL'auteur bdoughan