Transformer un élément vide en null lors d'unmarshalling avec JAXB
Une classe est définie de la manière suivante JAXB annotation:
class Course {
@XmlElement (name = "book")
List<Book> requiredBooks = new ArrayList<Book>();
Quand unmarshalling un document XML qui contient cette
<course>
...
<book/>
</course>
Je me retrouve avec un Livre ajouté à la liste, avec tous ses attributs null. Je n'ai pas de contrôle sur les entrées XML. Comment puis-je éviter ce vide carnet d'être ajouté? J'ai essayé de l'interception dans le jeu..() ou ajouter.. (), mais s'avère JAXB contourne setters lorsque vous traitez avec les collections. Des suggestions?
source d'informationauteur torngat
Vous devez vous connecter pour publier un commentaire.
Voici une solution qui ne travail. Encore une fois, l'élégance a été laissé derrière.
Il y a deux rappels défini par JAXB: beforeUnmarshal et afterUnmarshal. Par la mise en œuvre de afterUnmarshal nettoyer la liste, j'ai été en mesure d'atteindre le résultat souhaité.
Alors que cela fonctionne, par le plus grand problème est l'absence d'une interface pour la mise en œuvre de afterUnmarshal. Il est regardé par JAXB l'aide de la réflexion, mais je pense que ça aurait été plus pratique (et permettrait de réduire le débogage/maintenance) si JAXB simplement fourni des interfaces et/ou absract implémentations. Comme il est, que si la signature de afterUnmarshal des changements dans l'avenir? Ce code sera juste mystérieusement arrêt de travail qu'il est censé.
Dans EclipseLink JAXB (MOXy) nous avons le concept de nul de la politique. Cette null politique vous donne un peu de souplesse sur la façon de représenter la valeur null.
Vous pourriez modifier votre classe de ressembler à ce qui suit:
Cette annonce MOXy JAXB que pour cette propriété que vous souhaitez traiter des éléments vides comme nulle pour cette propriété.
Pour ce XML:
La requiredBooks propriété unmarshal: null, alivre, null.
Il y a actuellement un bug qui empêche ce travail que nous abordons maintenant. Vous pouvez suivre les progrès sur cette question ici:
Bien,
j'ai trouvé une façon de le faire, bien que je ne trouve pas ça super élégant.Edit: en Fait, la solution ci-dessous n'est pas fonctionner correctement. Il cause pas d'entrées pour être ajouté à la liste, indépendamment de leur être un élément vide ou entièrement formé avec des données.
Peut-être que je l'ai fait de mal, alors, tout les commentaires sont les bienvenus.
J'ai créé un adaptateur pour gérer la conversion et éclairé JAXB à l'aide d'une annotation:
et ensuite défini ma carte:
Cela fonctionne comme je le veux, mais, comme je l'ai dit plus tôt, je ne suis pas convaincu de son élégance.Edit: Comme décrit ci-dessus, cela ne fonctionne pas, mais probablement en raison d'une erreur de ma part.
Essayer cela,
J'ai fait une similaire cludge:
Mais j'ai trouvé ça tellement horrible que j'ai juste fini de commutation à Gson 😉
J'ai eu le même problème - j'ai besoin de gérer une liste de tableaux contenant les interfaces. Je viens de créer un adaptateur pour interface (MyInterfaceAdapter) et annoté de la Liste:
Ma carte ressemble à ceci:
Après unmarshalling j'ai une initialisé ArrayList (même vide).
Je pense que dans le problème posé ci-dessus, on peut ajouter des conditions supplémentaires et de retourner la valeur null dans le cas de vide de livre. D'autre part, je déteste aussi retourner null.