web-dev-qa-db-fra.com

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

avec jaxb, j'essaie de lire un fichier xml seuls quelques éléments du fichier xml sont intéressants, donc je voudrais sauter plusieurs

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

quand j'essaie 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 null ...

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

95
redfox26

J'ai aussi fait face à un problème comme celui-ci et je l'ai réglé.

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

Cela fonctionnera à 100%

171
user2067376

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

22
megathor

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

Je pense que c’est à cause de la position où nous utilisons le "@ XMLElement" annotation dans la classe (bean).

Et je pense que le JAXB (processeur d'annotation) considère le champ membre & la méthode getter du même élément de champ comme des propriétés différentes, lorsque nous utilisons le @ XMLElement annotation au niveau champ et lève l'exception IllegalAnnotationExceptions .

Message d'exception:

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

À la méthode Getter:

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

Au champ membre:

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

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

21
Sriram

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

à public Java.util.List testjaxp.ModeleREP.getTimeSeries ()

et 

sur protected Java.util.List testjaxp.ModeleREP.timeSeries

Vous devez configurer votre matériel JAXB pour utiliser des annotations (selon votre @XmlElement(name="TimeSeries")) et ignorer les méthodes publiques.

11
ptomli

viens d'ajouter cela à ma classe 

@XmlAccessorType(XmlAccessType.FIELD)

travaillé comme un cham

8
Ismael ozil

Si nous utilisons les annotations ci-dessous et supprimons l'annotation "@XmlElement", le code devrait fonctionner correctement et le XML résultant aurait des noms d'élément similaires au membre de la classe.

@XmlRootElement(name="<RootElementName>")
@XmlAccessorType(XmlAccessType.FIELD)

Dans le cas où l'utilisation de "@XmlElement" est vraiment nécessaire, veuillez le définir comme niveau de 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.

7
Naveen Rahangdale

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

Regardez al OOXS

7
Mike

Ce sont les deux propriétés que JAXB examine. 

public Java.util.List testjaxp.ModeleREP.getTimeSeries()  

et 

protected Java.util.List testjaxp.ModeleREP.timeSeries

Ceci peut être évité en utilisant l'annotation JAXB à la méthode get, comme mentionné ci-dessous.

@XmlElement(name="TimeSeries"))  
public Java.util.List testjaxp.ModeleREP.getTimeSeries()
5
Kondal Kolipaka

déclarez simplement les variables membres à private dans la classe que vous voulez convertir en XML .

4
Tayab Hussain

Il existe plusieurs solutions, mais si vous annotez sur la déclaration de variable, vous avez besoin de @XmlAccessorType(XmlAccessType.FIELD), mais si vous préférez annoter une méthode get ou set, vous ne le ferez pas.

Alors tu peux faire:

@XmlRootElement(name="MY_CLASS_A")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClassA
{
    @XmlElement(name = "STATUS")   
    private int status;
   //.. and so on
}

Ou:

@XmlRootElement(name="MY_CLASS_A")
public class MyClassA
{
    private int status;

    @XmlElement(name = "STATUS")         
    public int getStatus()
    {
    }
}
4
Baked Inhalf

"La classe a deux propriétés du même nom exception" peut arriver si vous avez un membre de la classe x avec un niveau d'accès public et un getter/setter pour le même membre.

En règle générale, il n'est pas recommandé d'utiliser un niveau d'accès public avec des getters et des setters.

Cochez cette case pour plus de détails: Propriété publique VS Propriété privée avec getter?

Pour résoudre ce problème:

  1. Changez le niveau d'accès de votre membre en private et conservez votre getter/setter
  2. Supprimer le getter et le setter du membre 
3
Naor Bar

Même problème que j'ai rencontré, j'ai ajouté 

@XmlRootElement(name="yourRootElementName")

@XmlAccessorType(XmlAccessType.FIELD)

et maintenant ça marche.

2
Anil

Je viens de rencontrer ce problème et de le résoudre. 

La source du problème est que vous avez à la fois XmlAccessType.FIELD et des paires de getters et de setters. La solution consiste à supprimer les paramètres et à ajouter un constructeur par défaut et un constructeur prenant tous les champs. 

2
Slava Imeshev

J'ai eu une classe de service avec signature comme ci-dessous "

@WebMethod
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) {

Lors de l'exécution, j'ai eu la même erreur pour les champs FetchIQAStatusResponseVO. Je viens d'ajouter une ligne au-dessus de FetchIQAStatusResponseVO:

@XmlAccessorType(XmlAccessType.FIELD) //This line added
public class FetchIQAStatusResponseVO {

et cela a résolu le problème.

1
S Agrawal

Cela fonctionnera lorsque vous placerez votre annotation devant les accesseurs, et la supprimerez des attributs protégés

protected String codingScheme;

@XmlAttribute(name = "codingScheme")
public String getCodingScheme() {
    return this.codingScheme;
}
1
Lilia

Un moyen simple et rapide de résoudre ce problème consiste à supprimer la @XmlElement(name="TimeSeries") du haut de la déclaration de déclaration de variable protected List<TimeSeries> timeSeries; au sommet de son getter, public List<TimeSeries> getTimeSeries().

Ainsi, votre classe ModeleREP ressemblera à:

@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;
  }
}

J'espère que ça aide!

0
Sourav Purakayastha

L'annotation avec @XmlTransient résout ce problème

@XmlTransient
public void setTimeSeries(List<TimeSeries> timeSeries) {
   this.timeSeries = timeSeries;
}

Consultez http://docs.Oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html pour plus de détails. 

0
kmaziarz