Mit Jaxb versuche ich, eine XML-Datei zu lesen. Nur einige Elemente in der XML-Datei sind interessant. Daher möchte ich viele Elemente überspringen
XML Ich versuche zu lesen
<?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>
meine Klasse
@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;
}
}
Wenn ich versuche, die XLM-Datei zu lesen, bekomme ich sie
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
Ich verstehe diesen Fehler nicht
edit: ich benutze jaxb-impl-2.1.12
Ok, jetzt habe ich keinen Fehler, aber wenn ich mein Objekt überprüfe, ist timeSeries null ...
Also scheint Jaxb vielleicht ein Problem mit FLX zu haben?
@XmlAccessorType(XmlAccessType.FIELD)
Anmerkung entfernt habeSie haben nicht angegeben, welche JAXB-IMPL-Version Sie verwenden, aber einmal hatte ich das gleiche Problem (mit jaxb-impl 2.0.5) und habe es mithilfe der Annotation auf Getter-Ebene gelöst, anstatt es auf Member-Ebene zu verwenden.
quelle
Ich habe auch einige ähnliche Probleme wie dieses gesehen.
Ich denke, das liegt an der Stelle, an der wir die Annotation " @XMLElement " in der ( Bean- ) Klasse verwenden.
Und ich denke, der JAXB (Annotation Processor) betrachtet die Member Field & Getter-Methode desselben Feldelements als unterschiedliche Eigenschaften, wenn wir die Annotation @XMLElement auf Feldebene verwenden und die Ausnahme IllegalAnnotationExceptions auslösen .
Ausnahmemeldung:
Bei der Getter-Methode:
Im Mitgliederfeld:
Lösung: Verwenden Sie @XmlElement nicht im Feld , sondern in der Getter- Methode.
quelle
habe dies gerade zu meiner Klasse hinzugefügt
arbeitete wie eine Cham
quelle
Es gibt mehrere Lösungen, aber grundsätzlich, wenn Sie die Variablendeklaration mit Anmerkungen versehen, benötigen Sie
@XmlAccessorType(XmlAccessType.FIELD)
diese. Wenn Sie jedoch lieber eine get- oder eine set-Methode mit Anmerkungen versehen möchten, ist dies nicht der Fall.So können Sie tun:
Oder:
quelle
Ihr JAXB betrachtet sowohl die
getTimeSeries()
Methode als auch das MitgliedtimeSeries
. Sie sagen nicht, welche JAXB-Implementierung Sie verwenden oder welche Konfiguration sie haben, aber die Ausnahme ist ziemlich klar.und
Sie müssen Ihr JAXB-Material so konfigurieren, dass Anmerkungen (gemäß Ihren Angaben
@XmlElement(name="TimeSeries")
) verwendet und öffentliche Methoden ignoriert werden.quelle
Sie müssen die Klasse
ModeleREP
genauso konfigurieren@XmlAccessorType(XmlAccessType.FIELD)
wie mit der KlasseTimeSeries
.Schauen Sie sich auch OOXS an
quelle
Wenn wir die folgenden Annotationen verwenden und die Annotation "@XmlElement" entfernen, sollte der Code ordnungsgemäß funktionieren und das resultierende XML würde die Elementnamen ähnlich dem Klassenmitglied haben.
Falls die Verwendung von "@XmlElement" wirklich erforderlich ist, definieren Sie es bitte als Feldebene und der Code sollte perfekt funktionieren. Definieren Sie die Anmerkung nicht oben in der Getter-Methode.
Hatte beide oben genannten Ansätze ausprobiert und musste das Problem beheben.
quelle
"Klasse hat zwei Eigenschaften mit derselben Namensausnahme" kann auftreten, wenn Sie ein Klassenmitglied x mit einer öffentlichen Zugriffsebene und einen Getter / Setter für dasselbe Mitglied haben.
Als Java-Faustregel wird nicht empfohlen, eine öffentliche Zugriffsebene zusammen mit Getter und Setter zu verwenden.
Überprüfen Sie dies für weitere Details: Öffentliches Eigentum VS Privateigentum mit Getter?
Um das zu beheben:
quelle
Dies sind die beiden Eigenschaften, die JAXB betrachtet.
und
Dies kann vermieden werden, indem die JAXB-Annotation at get-Methode wie unten erwähnt verwendet wird.
quelle
Deklarieren Sie einfach die Mitgliedsvariablen in der Klasse, die Sie in XML konvertieren möchten, als privat. Viel Spaß beim Codieren
quelle
Das gleiche Problem, mit dem ich konfrontiert war, fügte ich hinzu
und jetzt funktioniert es.
quelle
Ich bin gerade auf dieses Problem gestoßen und habe es gelöst.
Die Ursache des Problems ist, dass Sie sowohl XmlAccessType.FIELD als auch Paare von Gettern und Setzern haben. Die Lösung besteht darin, Setter zu entfernen und einen Standardkonstruktor und einen Konstruktor hinzuzufügen, der alle Felder akzeptiert.
quelle
Dies funktioniert, wenn Sie Ihre Anmerkung vor die Getter stellen und sie aus den geschützten Attributen entfernen:
quelle
Ich hatte eine Serviceklasse mit der folgenden Unterschrift "
Beim Ausführen habe ich den gleichen Fehler für
FetchIQAStatusResponseVO
Felder erhalten. Ich habe gerade eine Zeile hinzugefügt überFetchIQAStatusResponseVO
:und dies löste das Problem.
quelle
ModeleREP#getTimeSeries()
müssen mit@Transient
Anmerkungen sein. Das würde helfen.quelle
Das Kommentieren mit
@XmlTransient
behebt dieses ProblemWeitere Informationen finden Sie unter http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html
quelle
Eine schnelle und einfache Möglichkeit, dieses Problem zu beheben, besteht darin, die
@XmlElement(name="TimeSeries")
Anweisung vom Anfang der Variablendeklarationprotected List<TimeSeries> timeSeries;
an den Anfang des Getters zu entfernen.public List<TimeSeries> getTimeSeries()
.So
ModeleREP
sieht Ihre Klasse aus:Ich hoffe es hilft!
quelle
Ich habe Versuch und Irrtum gemacht und bin zu dem Schluss gekommen, dass Sie nur eines von beiden
@XMLElement
oder verwenden müssen@XmlAccessorType(XmlAccessType.FIELD)
.Wann welche verwenden?
Fall 1 : Wenn Ihre Feldnamen und Elementnamen, die Sie in einer XML-Datei verwenden möchten, unterschiedlich sind, müssen Sie diese verwenden
@XMLElement(name="elementName")
. Da dies Felder mit diesem Elementnamen bindet und in einer XML-Datei anzeigt.Fall 2 : Wenn sowohl die Feldnamen als auch der jeweilige Elementname in XML identisch sind, können Sie einfach verwenden
@XmlAccessorType(XmlAccessType.FIELD)
quelle
Es wurden viele Lösungen angegeben, und die Interna werden auch von @Sriram und @ptomli kurz angesprochen. Ich möchte nur ein paar Verweise auf den Quellcode hinzufügen, um zu verstehen, was unter der Haube passiert.
Standardmäßig (dh es werden überhaupt keine zusätzlichen Anmerkungen verwendet, außer
@XmlRootElement
für die Root-Klasse) versucht JABX, die auf zwei Arten offen gelegten Objekte zu marshallen:Beachten Sie, dass wenn ein Feld ist (oder eine Methode zurückgibt)
null
, die zurückgegeben wird) nicht in die Ausgabe geschrieben wird.Nun wenn
@XmlElement
es nun verwendet wird, können auch nicht öffentliche Dinge (Felder oder Getter-Methoden) gemarshallt werden.Die beiden Methoden, dh Felder und Getter-Methoden, dürfen jedoch nicht miteinander in Konflikt stehen. Andernfalls erhalten Sie die Ausnahme .
quelle