wake-up-neo.com

Jaxb, Class hat zwei Eigenschaften mit demselben Namen

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-Inhalt

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?

95
redfox26

Ich hatte auch ein Problem wie dieses und stellte dieses ein.

@XmlRootElement(name="yourRootElementName")
@XmlAccessorType(XmlAccessType.FIELD)

Das wird 100% funktionieren

171
user2067376

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.

22
megathor

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.

21
Sriram

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.

11
ptomli

fügte dies einfach zu meiner Klasse hinzu 

@XmlAccessorType(XmlAccessType.FIELD)

arbeitete wie eine cham

8
Ismael ozil

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.

7

Sie müssen die Klasse ModeleREP auch mit @XmlAccessorType(XmlAccessType.FIELD) wie mit der Klasse TimeSeries konfigurieren.

Habe einen Blick auf OOXS

7
Mike

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()
5
Kondal Kolipaka

deklarieren Sie einfach die Member-Variablen in der Klasse, die Sie in XML konvertieren möchten, als privat .__ Happy Code

4
Tayab Hussain

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()
    {
    }
}
4
Baked Inhalf

"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:

  1. Ändern Sie die Zugriffsebene Ihres Mitglieds in private und behalten Sie den Getter/Setter bei
  2. Entfernen Sie den Getter und Setter des Mitglieds 
3
Naor Bar

Das gleiche Problem, dem ich gegenüberstand, fügte ich hinzu 

@XmlRootElement(name="yourRootElementName")

@XmlAccessorType(XmlAccessType.FIELD)

und jetzt funktioniert es.

2
Anil

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. 

2
Slava Imeshev

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.

1
S Agrawal

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;
}
1
Lilia

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!

0

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

0
kmaziarz