IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Ordre des balises dans le xml généré - @XmlType(propOrder - IllegalAnnotationsException [JAXB]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut Ordre des balises dans le xml généré - @XmlType(propOrder - IllegalAnnotationsException
    Bonjour,

    jars utilisés: jaxb-api 2.2 et jaxb-impl 2.1.12


    J'ai à générer un xml devant être validé par un xsd, ce dernier impose un ordre précis des balises.

    pour des raisons spécifiques au projet, la classe finale à sérialiser hérite d'autres classes (par cascade).
    ex: classe_B fille de classe_A et chacune rajoute un détail ou plusieurs en plus.

    voici mon code exemple:

    classe à sérialiser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    package export.xml.aveclist;
     
    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    import export.xml.IdentifiableXmlType;
    import export.xml.simple.Personne;
     
    @XmlRootElement(name = "element-compose", namespace="http://x.y.z.com/exchange/hebdo")
    @XmlType(propOrder={"id", "status" , "maListeDePers"})
    public class ElementCompose extends IdentifiableXmlType{
    	private String _status;
    	@XmlElement(name = "status-personne")
    	public String getStatus() {
    		return _status;
    	}
     
    	public void setStatus(String status) {
    		_status = status;
    	}
     
    	@XmlElementWrapper(name = "list-personne", nillable = false)
        @XmlElement(name = "personne")
        public List<Personne> maListeDePers = new ArrayList<Personne>();
     
    	public List<Personne> getListPersonne() {
    		return maListeDePers;
    	}
     
    	public ElementCompose() {
    		super();
    	}
     
    	public ElementCompose(Long id, List<Personne> maListeDePers, String status) {
    		super(id);
    		this.maListeDePers = maListeDePers;
    		_status = status;
    	}
    }

    classe Personne utilisée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    package export.xml.simple;
     
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import export.xml.IdentifiableXmlType;
     
    @XmlRootElement(name="personne")
    @XmlType(propOrder={"id","name","age"})
    public class Personne extends IdentifiableXmlType{
     
    	String _name;
    	Integer _age;
     
    	@XmlElement(name = "name")
    	public String getName() {
    		return _name;
    	}
     
    	@XmlElement(name = "age")
    	public Integer getAge() {
    		return _age;
    	}
     
    	public void setName(String name) {
    		this._name = name;
    	}
     
    	public void setAge(Integer age) {
    		this._age = age;
    	}
     
    	/**
             * @param name
             * @param age
             */
    	public Personne(Long id, String name, Integer age) {
    		super(id);
    		this._name = name;
    		this._age = age;
    	}
     
    	@SuppressWarnings("unused")
    	private Personne() {
    		super();
    	}
    }
    classe mère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    package export.xml;
     
    import javax.xml.bind.annotation.XmlElement;
     
    public abstract class IdentifiableXmlType {
     
    	protected Long _id;
     
    	protected IdentifiableXmlType() {
    		super();
    	}
     
    	public IdentifiableXmlType(Long id) {
    		super();
    		_id = id;
    	}
     
    	@XmlElement(name="id")
    	public Long getId() {
    		return _id;
    	}
     
    	public void setId(Long id) {
    		_id = id;
    	}
    }

    L'exception que je récupère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
    Property id appears in @XmlType.propOrder, but no such property exists. Maybe you meant status?
    	this problem is related to the following location:
    		at export.xml.aveclist.ElementCompose
    Property id appears in @XmlType.propOrder, but no such property exists. Maybe you meant age?
    	this problem is related to the following location:
    		at export.xml.simple.Personne
    		at public java.util.List export.xml.aveclist.ElementCompose.maListeDePers
    		at export.xml.aveclist.ElementCompose
    
    	at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
    	at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
    	at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
    	at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1136)
    	at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
    	at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:592)
    	at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:211)
    	at javax.xml.bind.ContextFinder.find(ContextFinder.java:372)
    	at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    	at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    	at export.xml.aveclist.ElementComposeAccess.marshal(ElementComposeAccess.java:23)
    	at export.xml.aveclist.ElementComposeRepository.write(ElementComposeRepository.java:58)
    	at export.xml.aveclist.TestJaxbElementCompose.main(TestJaxbElementCompose.java:17)


    si je n'impose pas l'ordre avec l'annotation @Xmltype.porder, le fichier est généré mais pas avec le bon ordre des balises (une solution de contournement consiste à passer le résultat généré par une transformation XSLT si çe problème n'a pas de solution)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <p:element-compose>
         <id>99</id>
           <list-personne>
               <personne>
                   <id>1</id>
                   <age>41</age>
                   <name>name01</name>
                 </personne>
                <personne>
                   <id>11</id>
                    <age>411</age>
                   <name>name101</name>
              </personne>
         </list-personne>
         <status-personne>StautCOMP</status-personne>
    </p:element-compose>

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    Une solution consiste à annoter la classe mère en XmlTransient, comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @XmlTransient
    public abstract class IdentifiableXmlType {
    ....
    }
    et finalement j'ai l'ordre que je voulais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <p:element-compose>
        <id>99</id>
        <status-personne>StautCOMP</status-personne>
        <list-personne>
            <personne>
                <id>1</id>
                <name>name01</name>
                <age>41</age>
            </personne>
            <personne>
                <id>11</id>
                <name>name101</name>
                <age>411</age>
            </personne>
        </list-personne>
    </p:element-compose>

    La solution je l'ai trouvé sur ce lien :
    http://blog.bdoughan.com/2012/08/jax...rty-order.html

    ce qu'il dit à propos de l'utilisation de @XmlTransient:
    To exclude a class from being mapped as part of the inheritance hierarchy you simply need to annotate it with @XmlTransient. Any super classes of this class that are not annotated with @XmlTransient (i.e. Base) will still be mapped.



    Since the parent class (Person) has been marked @XmlTransient the name property will be treated as part of the Customer class and can be included in the propOrder. The Customer class also extends Base which was not marked @XmlTransient so the id property can not be specified in the propOrder. The propOrder setting must not include a field/property that has been annotated with @XmlTransient.....Blaise Doughan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter des balises dans fichier xml
    Par javast dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 15/12/2012, 09h30
  2. changer le nom des balises dans un XML
    Par ellgafsi dans le forum Modules
    Réponses: 13
    Dernier message: 25/03/2009, 15h10
  3. [XDoclet] [Hibernate] Ordre déterministe des attributs dans hbm.xml générés
    Par Dirty Henry dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 21/03/2007, 15h49
  4. [XSLT]Modifier l'ordre des balises XML
    Par Philos15 dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 18/10/2006, 09h54
  5. [XML] validation de fichier XML:l'ordre des balises compte ?
    Par longbeach dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/09/2005, 18h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo