avec jaxb, j'essaie de lire un fichier xml, seuls quelques éléments du fichier xml sont intéressants, je voudrais donc sauter de nombreux éléments
xml j'essaye de lire
<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2010 rel. 3 sp1 (http://www.altova.com)-->
<flx:ModeleREP xsi:schemaLocation="urn:test:mod_rep.xsd mod_rep.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flx="urn:test:mod_rep.xsd">
<flx:DocumentHeader>
<flx:Identification v="04489"/>
</flx:DocumentHeader>
<flx:TimeSeries>
<flx:Identification v="test1a"/>
<flx:BusinessType v="A01"/>
<flx:Product v="123a"/>
<flx:ResourceObject codingScheme="N" v="testa"/>
<flx:Period>
<flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/>
<flx:Resolution v="PT2H"/>
<flx:Pt>
<flx:P v="1"/>
<flx:Q unitCode="String" v="1.0"/>
<flx:A currencyIdentifier="String" v="195.0"/>
</flx:Pt>
</flx:Period>
</flx:TimeSeries>
<flx:TimeSeries>
<flx:Identification v="test2a"/>
<flx:BusinessType v="A01"/>
<flx:Product v="a123b"/>
<flx:ResourceObject codingScheme="N" v="test2"/>
<flx:Period>
<flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/>
<flx:Resolution v="PT2H"/>
<flx:Pt>
<flx:P v="1"/>
<flx:Q unitCode="String" v="1.0"/>
<flx:A currencyIdentifier="String" v="195.0"/>
</flx:Pt>
<flx:Pt>
<flx:P v="2"/>
<flx:Q unitCode="String" v="1.0"/>
<flx:A currencyIdentifier="String" v="195.0"/>
</flx:Pt>
</flx:Period>
</flx:TimeSeries>
</flx:ModeleREP>
Ma classe
@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd")
public class ModeleREP {
@XmlElement(name="TimeSeries")
protected List<TimeSeries> timeSeries;
public List<TimeSeries> getTimeSeries() {
if (this.timeSeries == null) {
this.timeSeries = new ArrayList<TimeSeries>();
}
return this.timeSeries;
}
public void setTimeSeries(List<TimeSeries> timeSeries) {
this.timeSeries = timeSeries;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "TimeSeries")
public class TimeSeries {
@XmlElement(name="ResourceObject")
protected RessourceObject resourceObject;
@XmlElement(name = "Period")
protected Period period;
public RessourceObject getResourceObject() {
return this.resourceObject;
}
public void setResourceObject(RessourceObject resourceObject) {
this.resourceObject = resourceObject;
}
public Period getPeriod() {
return this.period;
}
public void setPeriod(Period period) {
this.period = period;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ResourceObject")
public class RessourceObject {
@XmlAttribute(name = "codingScheme")
protected String codingScheme;
@XmlAttribute(name = "v")
protected String v;
public String getCodingScheme() {
return this.codingScheme;
}
public void setCodingScheme(String codingScheme) {
this.codingScheme = codingScheme;
}
public String getV() {
return this.v;
}
public void setV(String v) {
this.v = v;
}
}
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "Period")
public class Period {
@XmlElement(name = "TimeInterval")
protected TimeInterval timeInterval;
@XmlElement(name = "Pt")
protected List<Pt> pt;
public TimeInterval getTimeInterval() {
return this.timeInterval;
}
public void setTimeInterval(TimeInterval timeInterval) {
this.timeInterval = timeInterval;
}
public List<Pt> getPt() {
if (this.pt == null) {
this.pt = new ArrayList<Pt>();
}
return this.pt;
}
public void setPt(List<Pt> pt) {
this.pt=pt;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "TimeInterval")
public class TimeInterval {
@XmlAttribute(name = "v")
private String timeIntervalPeriod;
public String getTimeIntervalPeriod() {
return this.timeIntervalPeriod;
}
public void setTimeIntervalPeriod(String timeIntervalPeriod) {
this.timeIntervalPeriod = timeIntervalPeriod;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Pt")
public class Pt {
@XmlElement(name = "P")
protected P p;
@XmlElement(name = "A")
protected A a;
public P getP() {
return this.p;
}
public void setP(P p) {
this.p = p;
}
public A getA() {
return this.a;
}
public void setA(A a) {
this.a = a;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "P")
public class P {
@XmlAttribute(name = "v")
protected String position;
public String getPosition(){
return this.position;
}
public void setPosition(String position){
this.position=position;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "A")
public class A {
@XmlAttribute(name = "v")
protected String calculatedAmount;
public String getCalculatedAmount() {
return this.calculatedAmount;
}
public void setCalculatedAmount(String calculatedAmount) {
this.calculatedAmount = calculatedAmount;
}
}
quand j'essaye de lire le fichier xlm je reçois je reçois
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "timeSeries"
this problem is related to the following location:
at public java.util.List testjaxp.ModeleREP.getTimeSeries()
at testjaxp.ModeleREP
this problem is related to the following location:
at protected java.util.List testjaxp.ModeleREP.timeSeries
at testjaxp.ModeleREP
je ne comprends pas cette erreur
edit: j'utilise jaxb-impl-2.1.12
ok maintenant je n'ai aucune erreur, mais quand je vérifie mon objet, timeSeries est nul ...
alors peut-être que jaxb semble avoir un problème avec flx?
@XmlAccessorType(XmlAccessType.FIELD)
annotationVous n'avez pas spécifié la version de JAXB-IMPL que vous utilisez, mais une fois j'ai eu le même problème (avec jaxb-impl 2.0.5) et je l'ai résolu en utilisant l'annotation au niveau du getter au lieu de l'utiliser au niveau du membre.
la source
J'ai également vu des problèmes similaires comme celui-ci.
Je pense que c'est à cause de l' endroit où nous utilisons l' annotation " @XMLElement " dans la classe (bean).
Et je pense que le JAXB (processeur d'annotations) considère le champ membre et la méthode getter du même élément de champ comme des propriétés différentes, lorsque nous utilisons l' annotation @XMLElement au niveau du champ et lançons l' exception IllegalAnnotationExceptions .
Message d'exception:
À la méthode Getter:
Au champ membre:
Solution: au lieu d'utiliser @XmlElement dans le champ , utilisez-le dans la méthode getter .
la source
vient de l'ajouter à ma classe
a travaillé comme un cham
la source
Il existe plusieurs solutions, mais fondamentalement, si vous annotez sur la déclaration de variable, vous en avez besoin
@XmlAccessorType(XmlAccessType.FIELD)
, mais si vous préférez annoter une méthode get ou set, vous ne le faites pas.Vous pouvez donc faire:
Ou:
la source
Votre JAXB examine à la fois la
getTimeSeries()
méthode et le membretimeSeries
. Vous ne dites pas quelle implémentation JAXB vous utilisez, ni sa configuration, mais l'exception est assez claire.et
Vous devez configurer vos éléments JAXB pour utiliser des annotations (selon votre
@XmlElement(name="TimeSeries")
) et ignorer les méthodes publiques.la source
Vous devez également configurer la classe
ModeleREP
avec@XmlAccessorType(XmlAccessType.FIELD)
comme vous l'avez fait avec la classeTimeSeries
.Jetez un œil à OOXS
la source
Si nous utilisons les annotations ci-dessous et supprimons l'annotation «@XmlElement», le code devrait fonctionner correctement et le XML résultant aurait les noms d'élément similaires au membre de la classe.
Dans le cas où l'utilisation de "@XmlElement" est vraiment nécessaire, veuillez le définir au niveau du champ et le code devrait fonctionner parfaitement. Ne définissez pas l'annotation en haut de la méthode getter.
Avait essayé les deux approches mentionnées ci-dessus et réussi à résoudre le problème.
la source
"La classe a deux propriétés du même nom exception" peut se produire lorsque vous avez un membre de classe x avec un niveau d'accès public et un getter / setter pour le même membre.
En règle générale de Java, il n'est pas recommandé d'utiliser un public niveau d'accès avec les getters et les setters.
Vérifiez ceci pour plus de détails: Propriété publique VS Propriété privée avec getter?
Pour résoudre ce problème:
la source
Ce sont les deux propriétés que JAXB examine.
et
Cela peut être évité en utilisant l'annotation JAXB à la méthode get comme mentionné ci-dessous.
la source
déclarez simplement les variables membres comme privées dans la classe que vous souhaitez convertir en XML. Bon codage
la source
Même problème que j'ai rencontré, j'ai ajouté
et maintenant cela fonctionne.
la source
Cela fonctionnera lorsque vous placerez votre annotation avant les getters et que vous la supprimerez des attributs protégés:
la source
Je viens de rencontrer ce problème et je l'ai résolu.
La source du problème est que vous avez à la fois XmlAccessType.FIELD et des paires de getters et de setters. La solution est de supprimer les setters et d'ajouter un constructeur par défaut et un constructeur qui prend tous les champs.
la source
J'ai eu une classe de service avec la signature ci-dessous "
En cours d'exécution, j'ai eu la même erreur pour les
FetchIQAStatusResponseVO
champs. Je viens d'ajouter une ligne en plus deFetchIQAStatusResponseVO
:et cela a résolu le problème.
la source
ModeleREP#getTimeSeries()
doivent être avec@Transient
annotation. Cela aiderait.la source
Annoter avec
@XmlTransient
résout ce problèmeRegardez http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html pour plus de détails
la source
Un moyen rapide et simple de résoudre ce problème consiste à supprimer le
@XmlElement(name="TimeSeries")
du haut de l'instruction de déclaration de variableprotected List<TimeSeries> timeSeries;
vers le haut de son getter,public List<TimeSeries> getTimeSeries()
.Ainsi, votre
ModeleREP
classe ressemblera à:J'espère que ça aide!
la source
J'ai fait des essais et des erreurs et j'ai conclu que vous ne devez utiliser que l'un des deux
@XMLElement
ou@XmlAccessorType(XmlAccessType.FIELD)
.Quand utiliser lequel?
cas 1 : Si vos noms de champ et le nom d'élément que vous souhaitez utiliser dans un fichier xml sont différents, vous devez utiliser
@XMLElement(name="elementName")
. Comme cela liera les champs avec ce nom d'élément et s'affichera dans un fichier XML.cas 2 : Si les noms de champs et le nom d'élément respectif dans xml sont tous les deux identiques, vous pouvez simplement utiliser
@XmlAccessorType(XmlAccessType.FIELD)
la source
De nombreuses solutions ont été proposées, et les internes sont brièvement touchés par @Sriram et @ptomli également. Je veux juste ajouter quelques références au code source pour aider à comprendre ce qui se passe sous le capot.
Par défaut (c'est-à-dire pas d'annotations supplémentaires utilisées du tout sauf
@XmlRootElement
sur la classe racine), JABX essaie de rassembler les éléments exposés de deux manières:Notez que si un champ est (ou une méthode retourne)
null
, il ne sera pas écrit dans la sortie.Maintenant si
@XmlElement
est utilisé, les choses non publiques (qui peuvent être des champs ou des méthodes getter) peuvent également être rassemblées.Mais les deux méthodes, à savoir les champs et les méthodes getter, ne doivent pas entrer en conflit l'une avec l'autre. Sinon, vous obtenez l'exception .
la source