JAXB Marshalling et génériques
Je suis en train d'utiliser JAXB introspection à marshall et unmashall certains objets du domaine balisé avec des annotations JAXB. La plupart des choses fonctionnent comme prévu, mais je suis tout à fait avoir un peu de mal à obtenir un assez simple classe à sérialiser. Cette classe est utilisée comme un @XmlElement sur un certain nombre de haricots et ressemble à quelque chose comme:
public class Range<E extends Comparable<E>> implements Serializable {
protected boolean startInclusive, endInclusive;
protected E start, end;
public Range(){
startInclusive = endInclusive = true;
}
public boolean contains(E value){...}
public E getEnd() {
return end;
}
public void setEnd(E end) {
this.end = end;
}
public boolean isEndInclusive() {
return endInclusive;
}
public void setEndInclusive(boolean endInclusive) {
this.endInclusive = endInclusive;
}
public E getStart() {
return start;
}
public void setStart(E start) {
this.start = start;
}
public boolean isStartInclusive() {
return startInclusive;
}
public void setStartInclusive(boolean startInclusive) {
this.startInclusive = startInclusive;
}
}
J'ai essayé de le faire, sans succès, JAXB est toujours fâché avec l'interface Comparable.
public class DoubleRange extends Range<Double> {}
Utilisant à la fois la Plage et DoubleRange comme type de retour de la fève de lecture les rendements d'une exception comme:
java.lang.Comparable est une interface, et JAXB ne peut pas gérer les interfaces. ce problème est lié à l'emplacement suivant: à java.lang.Comparable à la protection de java.lang.Comparable com.controlpath.util.Gamme.démarrer à l'exemple.util.Gamme à l'exemple.util.DoubleRange au public exemple.util.DoubleRange exemple.domaine.SomeBean.getRange() à l'exemple.domaine.SomeBean
Je me rends compte que dans la plupart des cas, la Liste des<T> Map<T, U> seul le travail parce que le JAXB spécification a des dispositions particulières pour ces types quand ils se sont rencontrés sur les haricots, mais est-il une façon de transmettre ce que je veux à la JAXB introspection moteur sans avoir à ré-écrire de gamme avec des non-générique champs?
source d'informationauteur Steve Skrla | 2009-05-05
Vous devez vous connecter pour publier un commentaire.
Vous pourriez écrire un adaptateur personnalisé (pas à l'aide de JAXB est XmlAdapter) en procédant comme suit:
1) déclarer une classe qui accepte toutes sortes d'éléments et a des annotations JAXB
et les traite comme vous le souhaitez (dans mon exemple, j'ai tout convertir String)
2) l'utilisation de cette classe à la place de E dans votre être mobilisé classe
NOTES
c'est trop difficile, attendre une meilleure proposition que le mien 😉
Comment sur
Nombre est un classe
Je parie que JAXB sait par défaut marshalling/unmarshalling règles pour le Nombre
Pour unmarshalling de type spécifique, vous avez besoin XmlAdapter comme je l'ai
il est décrit ici: JAXB héritage, unmarshal à la sous-classe de marshalée la classe
Essayer quelque chose comme Simple Sérialisation XML il est livré avec un support pour les types génériques dans les éléments XML avec un certain nombre d'annotations telles que @Élément et @ElementList. Le modèle de programmation est très similaire, mais plus simple que JAXB.
En fait, il n'est pas très clair pour moi pourquoi cela ne fonctionnerait pas. Il semble que JAXB devrait être en mesure de résoudre certains sous-type correctement: si (et seulement si!) ce type n'est PAS le type de racine (ce qui n'est pas selon votre description). Je veux dire, c'est juste une Fève; ainsi, si le haricot avec T remplacé par un type d'œuvres, ce qui devrait leur version générique forum à l'aide de sous-classement de lier des types (exemple).
Alors peut-être il pourrait être un bug dans la mise en œuvre?
Donc il semble que le problème est l'effacement de
E
surstart
etend
estComparable
. Si il ne peut pas gérer les interfaces vous pouvez essayer deObject
mais j'espère qu'il se plaint aussi (que ce soit maintenant ou plus tard). Peut-être que tu pourrais faireRange
abstrait et de se spécialiser pour chaqueE
. Je devrais en savoir plus à propos de JAXB.