135 votes

Jaxb, Class a deux propriétés du même nom

Avec jaxb, j'essaie de lire un fichier xml seulement quelques éléments dans le fichier xml sont intéressants, donc je voudrais sauter beaucoup d'éléments.

contenu xml

xml j'essaie 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;
}
}

Lorsque j'essaie de lire le fichier xlm, j'obtiens les résultats suivants j'obtiens

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 pas d'erreur, mais quand je vérifie mon objet, timeSeries est null...

donc peut-être que jaxb semble avoir un problème avec flx ?

231voto

user2067376 Points 441

J'ai également rencontré ce problème et j'ai réglé ce problème.

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

Cela fonctionnera à 100%.

9 votes

J'ai eu le même problème. Et même cela fonctionne lorsque nous ajoutons seulement @XmlAccessorType(XmlAccessType.FIELD)

2 votes

J'ai résolu le problème en enlever le site @XmlAccessorType(XmlAccessType.FIELD) annotation

0 votes

Cela semble étrange, mais je me suis également débarrassé de cette exception en réduisant la paire d'annotations \@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) à seulement \@XmlRootElement

26voto

megathor Points 302

Vous n'avez pas précisé quelle version de JAXB-IMPL vous utilisez, mais j'ai déjà 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.

0 votes

C'est correct, j'ai juste enlevé l'annotation du membre et l'ai mis au niveau du setter et ça a marché.

24voto

Sriram Points 897

J'ai également vu des problèmes similaires à celui-ci.

Je pense que c'est à cause de la place où nous utilisons le " @XMLElement " annotation dans la classe (haricot).

Et je pense, 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 l'on utilise la méthode @XMLElement au niveau de la champ et lance le IllegalAnnotationExceptions exception.

Message d'exception :

La classe a deux propriétés de la même nom "timeSeries"

Méthode At Getter :

    at public java.util.List testjaxp.ModeleREP.getTimeSeries()

Au champ des membres :

    at protected java.util.List testjaxp.ModeleREP.timeSeries

Solution : Au lieu d'utiliser @XmlElement dans le champ , l'utiliser dans le getter méthode.

11voto

ptomli Points 5778

Votre JAXB regarde à la fois le getTimeSeries() et le membre timeSeries . Vous ne dites pas quelle implémentation JAXB vous utilisez, ni sa configuration, mais l'exception est assez claire.

at public java.util.List testjaxp.ModeleREP.getTimeSeries()

and

at protected java.util.List testjaxp.ModeleREP.timeSeries

Vous devez configurer votre matériel JAXB pour qu'il utilise les annotations (conformément à votre stratégie de gestion des annotations). @XmlElement(name="TimeSeries") ) et ignore les méthodes publiques.

0 votes

Je le fais déjà : @XmlElement(name="TimeSeries") protected List<TimeSeries> timeSeries ;

4 votes

Si je change (XmlAccessType.FIELD) en (XmlAccessType.NONE), je peux garder XmlElement au niveau des membres.

0 votes

J'ai également dû ajouter @XmlTransient à la variable

8voto

Mike Points 61

Vous devez configurer la classe ModeleREP également avec @XmlAccessorType(XmlAccessType.FIELD) comme vous l'avez fait avec la classe TimeSeries .

Jetez un coup d'œil à OOXS

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X