mit jaxb versuche ich, eine xml-datei zu lesen. nur ein paar elemente in 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 ich bekomme
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 verwende jaxb-impl-2.1.12
ok jetzt habe ich keine fehler, aber wenn ich mein objekt überprüfe, ist timeSeries null ...
also scheint jaxb ein problem mit flx zu haben?
Ich hatte auch ein Problem wie dieses und stellte dieses ein.
@XmlRootElement(name="yourRootElementName")
@XmlAccessorType(XmlAccessType.FIELD)
Das wird 100% funktionieren
Sie haben nicht angegeben, welche JAXB-IMPL-Version Sie verwenden, aber einmal hatte ich das gleiche Problem (mit jaxb-impl 2.0.5) und löste es mithilfe der Annotation auf Getter-Ebene, anstatt auf Mitgliedsebene.
Ich habe auch einige ähnliche Probleme wie dieses gesehen.
Ich denke, es liegt an der Stelle , an der wir das "@ XMLElement" Annotation in der Klasse (Bean).
Und ich denke, der JAXB (Annotation Processor) betrachtet die Methode member field & getter desselben Feldelements als unterschiedliche Eigenschaften, wenn wir die verwenden @ XMLElement Annotation auf der Ebene Feld und löst die Ausnahme IllegalAnnotationExceptions aus.
Ausnahmemeldung:
Klasse hat zwei Eigenschaften des gleichen Namens "timeSeries"
At Getter-Methode:
at public Java.util.List testjaxp.ModeleREP.getTimeSeries()
Am Mitgliedsfeld:
at protected Java.util.List testjaxp.ModeleREP.timeSeries
Lösung: Anstelle von @ XmlElement Verwenden Sie es im Feld in der Getter -Methode.
Ihr JAXB betrachtet sowohl die getTimeSeries()
-Methode als auch das Member timeSeries
. Sie sagen nicht, welche JAXB-Implementierung Sie verwenden, oder deren Konfiguration, aber die Ausnahme ist ziemlich klar.
in der öffentlichen Java.util.List testjaxp.ModeleREP.getTimeSeries ()
und
at protected Java.util.List testjaxp.ModeleREP.timeSeries
Sie müssen Ihr JAXB-Zeug konfigurieren, um Anmerkungen (gemäß Ihrer @XmlElement(name="TimeSeries")
) zu verwenden und öffentliche Methoden zu ignorieren.
fügte dies einfach zu meiner Klasse hinzu
@XmlAccessorType(XmlAccessType.FIELD)
arbeitete wie eine cham
Wenn wir die folgenden Annotationen verwenden und die Annotation "@XmlElement" entfernen, sollte der Code ordnungsgemäß funktionieren und das resultierende XML hätte die Elementnamen, die dem Klassenmitglied ähnlich sind.
@XmlRootElement(name="<RootElementName>")
@XmlAccessorType(XmlAccessType.FIELD)
Falls wirklich "@XmlElement" erforderlich ist, definieren Sie es als Feldebene und der Code sollte einwandfrei funktionieren. Definieren Sie die Anmerkung nicht auf der Getter-Methode.
Hatte beide genannten Ansätze ausprobiert und konnte das Problem beheben.
Sie müssen die Klasse ModeleREP
auch mit @XmlAccessorType(XmlAccessType.FIELD)
wie mit der Klasse TimeSeries
konfigurieren.
Habe einen Blick auf OOXS
Dies sind die beiden Eigenschaften, die sich JAXB anschaut.
public Java.util.List testjaxp.ModeleREP.getTimeSeries()
und
protected Java.util.List testjaxp.ModeleREP.timeSeries
Dies kann durch die Verwendung der JAXB-Annotation bei der get-Methode vermieden werden.
@XmlElement(name="TimeSeries"))
public Java.util.List testjaxp.ModeleREP.getTimeSeries()
deklarieren Sie einfach die Member-Variablen in der Klasse, die Sie in XML konvertieren möchten, als privat .__ Happy Code
Es gibt mehrere Lösungen, aber wenn Sie die Variablendeklaration mit Anmerkungen versehen, benötigen Sie @XmlAccessorType(XmlAccessType.FIELD)
. Wenn Sie jedoch lieber eine get- oder eine set-Methode mit Anmerkungen versehen, ist dies nicht der Fall.
So können Sie tun:
@XmlRootElement(name="MY_CLASS_A")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClassA
{
@XmlElement(name = "STATUS")
private int status;
//.. and so on
}
Oder:
@XmlRootElement(name="MY_CLASS_A")
public class MyClassA
{
private int status;
@XmlElement(name = "STATUS")
public int getStatus()
{
}
}
"Klasse hat zwei Eigenschaften desselben Namens" kann auftreten, wenn Sie ein Klassenmitglied x mit einer öffentlichen Zugriffsebene und einen Getter/Setter für dasselbe Mitglied haben.
Als Daumenregel für Java wird die Verwendung einer Zugriffsebene public zusammen mit Getern und Setters nicht empfohlen.
Überprüfen Sie dies für weitere Details: Öffentliches Eigentum VS Privateigentum mit Getter?
Um das zu beheben:
Das gleiche Problem, dem ich gegenüberstand, fügte ich hinzu
@XmlRootElement(name="yourRootElementName")
@XmlAccessorType(XmlAccessType.FIELD)
und jetzt funktioniert es.
Ich bin gerade auf dieses Problem gestoßen und habe es gelöst.
Die Ursache des Problems liegt darin, dass Sie sowohl XmlAccessType.FIELD als auch Paare von Gettern und Setters haben. Die Lösung besteht darin, Setter zu entfernen und einen Standardkonstruktor und einen Konstruktor hinzuzufügen, der alle Felder übernimmt.
Ich hatte eine Service-Klasse mit Signatur wie unten "
@WebMethod
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) {
Bei der Ausführung erhielt ich den gleichen Fehler für FetchIQAStatusResponseVO
-Felder. Ich habe gerade eine Zeile über FetchIQAStatusResponseVO
hinzugefügt:
@XmlAccessorType(XmlAccessType.FIELD) //This line added
public class FetchIQAStatusResponseVO {
und damit wurde das Problem gelöst.
Es funktioniert, wenn Sie Ihre Anmerkung vor die Getter setzen und sie aus den geschützten Attributen entfernen:
protected String codingScheme;
@XmlAttribute(name = "codingScheme")
public String getCodingScheme() {
return this.codingScheme;
}
Dieses Problem lässt sich schnell und einfach beheben, indem Sie @XmlElement(name="TimeSeries")
vom Anfang der Variablendeklarationsanweisung protected List<TimeSeries> timeSeries;
bis zum Anfang des Getter public List<TimeSeries> getTimeSeries()
entfernen.
So sieht Ihre ModeleREP
-Klasse folgendermaßen aus:
@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd")
public class ModeleREP {
protected List<TimeSeries> timeSeries;
@XmlElement(name="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;
}
}
Ich hoffe es hilft!
Durch Anmerkungen mit @XmlTransient
wird dieses Problem behoben
@XmlTransient
public void setTimeSeries(List<TimeSeries> timeSeries) {
this.timeSeries = timeSeries;
}
Weitere Informationen erhalten Sie unter http://docs.Oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html