JAXB: N'est-il pas possible d'utiliser un XmlAdapter sans @XmlJavaTypeAdapter?
Je ne peux pas enregistrer un tas de XmlAdapter
s à Marshaller
|Unmarshaller
de sorte que je n'aurais pas besoin de spécifier @XmlJavaTypeAdapter
sur chaque déposée, dont le type n'est pas nativement JAXB-pris en charge?
Je trouve cela un peu redondant.
BTW, someMarshaller.setAdapter(...)
ne semblent pas faire n'importe quoi.
source d'informationauteur java.is.for.desktop.indeed
Vous devez vous connecter pour publier un commentaire.
C'est une très bonne question !
La réponse courte est que pasà l'aide de
setAdapter
sur marshaller /unmarshaller ne signifie pas que vous n'avez pas à utiliser@XmlJavaTypeAdapter
.Laissez-moi vous expliquer ce avec un hypothétique (encore valide!) scénario.
Prendre en considération dans une application web, un extrait d'un événement dans la forme de xml avoir schéma suivant:
Équivalent à cela, votre modèle ressemblera:
Maintenant l'application est d'ores et déjà un bean a appelé
User
qui maintient le détaildes informations sur l'utilisateur.
Noter que cette
User
n'est pas connu pour votre JAXB Contexte.Pour des raisons de simplicité, nous avons Utilisateur POJO, mais il peut être Valable, toute Classe Java.
De l'application de l'architecte voulez est
Event
'sperformedBy
devrait être représenté commeUser
pour gagner plus de détails.
Ici @XmlJavaTypeAdapter entre en image
JAXBContext est conscient
performedBy
commexs:string
, mais il doit être représenté commeUser
dans la mémoire en Java.Modèle modifié ressemble:
UserAdapter.java:
La Carte de la définition dit que -
À venir pour revenir à votre question -
Considérer que notre Carte requiert une classe appelée UserContext afin de maréchal /unmarshal avec succès.
Maintenant, la question est de savoir comment les UserAdapter va chercher un instace de UserContext ??
Comme un bon design doit toujours d'approvisionnement, alors qu'il a instancié ..
Mais JAXB d'Exécution ne peut accepter que l'Adaptateur Sans-args constructeur ..
(Évidemment JAXBContext ne savent pas à propos de l'application specific model)
Donc, heureusement, il y a une option 😀
Vous pouvez dire à votre
unmarshaller
à utiliser instance donnée deUserAdapter
plutôt que de l'activation par ses propres.setAdapter
la méthode est disponible sur les deuxMarshaller
&Unmarshaller
Remarque:
setAdapter
sur marshaller /unmarshaller ne signifie pas que vous n'avez pas à utiliser@XmlJavaTypeAdapter
.Si vous omettez ce JAXB d'exécution n'a pas d'indice que l'Utilisateur est votre tenue Type & Type de Valeur, c'est autre chose. Il va essayer de maréchal
User
comme & u va finir par avoir mal xml(ou d'échec de validation si activé)
Bien que nous ayons pris un scénario où la Carte est nécessaire pour être avec des arguments, donc
utilisation
setAdapter
méthode.Certains avancée usages sont aussi là, où, même si vous avez par défaut no-arg constructeur, mais vous fournir une instance de l'Adaptateur
Peut-cet adaptateur est configuré avec des données, qui maréchal /unmarshal opération à l'aide !
Vous pouvez utiliser la package-info.java
Que l'on appelle le "paquet".
Exemple :
mettre un package-info.java dans le même package que la classe que vous souhaitez marshall/unmarshall.
Supposons que vous avez une classe mypackage.de modèle.Un et un adaptateur CalendarAdapter dans mypackage.l'adaptateur.
Déclarer un package-info.java fichier dans mypackage.modèle contenant :
Tous les champs de type Calendrier dans la classe A sera mobilisé ou unmarshalled avec le CalendarAdapter.
Vous pouvez trouver les informations utiles :
http://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.html