JAXB et commande de propriété

Je souhaite que la sortie XML sérialisée de ma classe Java respecte le classement des propriétés dans la classe Java.

Il semble que JAXB ordonne par ordre alphabétique.

Je peux remplacer cela en utilisant @XmlType avec propOrder et en spécifiant TOUTES les propriétés, mais j’ai une classe avec de nombreuses propriétés et celles-ci ne sont pas encore finalisées.

J’ai lu que spécifier un propOrder vide le ferait mais ce n’est pas le cas.

Mon exemple de classe:

 package test; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlRootElement //@XmlType(propOrder={"company", "scheme", "agreementNumber"}) @XmlType(propOrder={}) // makes no difference - still alphabetical in XML public class CustomerPlan2 { private Ssortingng company; private Ssortingng scheme; private Ssortingng agreementNumber; @XmlElement(name="Company") public Ssortingng getCompany() { return company; } public void setCompany(Ssortingng company) { this.company = company; } @XmlElement(name="Scheme") public Ssortingng getScheme() { return scheme; } public void setScheme(Ssortingng scheme) { this.scheme = scheme; } @XmlElement(name="AgreementNumber") public Ssortingng getAgreementNumber() { return agreementNumber; } public void setAgreementNumber(Ssortingng agreementNumber) { this.agreementNumber = agreementNumber; } } 

Mon code de sérialisation:

  CustomerPlan2 cp2 = new CustomerPlan2(); cp2.setCompany("company"); cp2.setScheme("scheme"); cp2.setAgreementNumber("agreementnumber"); JAXBContext context = JAXBContext.newInstance(CustomerPlan2.class); Marshaller marshaller = context.createMarshaller(); marshaller.marshal(cp2, new FileWriter("C:\\temp\\out.xml")); 

Sortie:

   agreementnumber company scheme  

Je veux que ma sortie soit (comme l’ordre de propriété de ma classe):

   company scheme agreementnumber  

Merci pour toute aide à ce sujet.

    C’est possible en utilisant:

     @XmlType (propOrder={"prop1","prop2",..."propN"}) 

    Décommentez simplement le code comme ceci:

     //@XmlType(propOrder={"company", "scheme", "agreementNumber"}) 

    Ceci est l’utilisation correcte.

    Remarque: je dirige EclipseLink JAXB (MOXy)

    L’ordre dans lequel la reflection Java renvoie la liste des champs / propriétés n’est pas garanti. C’est pourquoi les implémentations JAXB ne l’utilisent pas pour déterminer l’ordre des éléments.

    Par défaut, JAXB ne fournit aucun ordre garanti . Cependant, la plupart (sinon toutes les implémentations JAXB) utilisent un ordre alphabétique car il est déterministe. Pour garantir cette commande, vous devez annoter votre classe comme suit:

     @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) public class Foo { ... } 
     @XmlType(propOrder={"company", "scheme", "agreementNumber"}) 

    C’est correct, mais as-tu essayé ça?

     @XmlType(propOrder={"Company", "Scheme", "AgreementNumber"}) 

    Ce thread est ancien, mais il vaut la peine de savoir comment mes propriétés génèrent du XML dans le bon ordre et n’utilisent PAS l’ordre alphabétique car cela n’est pas souhaitable. Une chose à noter est que j’utilise wink et jaxb qui peuvent se comporter différemment des autres fournisseurs. Wink était très précis sur ce qui était dans la liste proprement dite. Même les éléments que je marque comme xml transitoires ou pas du tout décorés devaient faire partie de

     @XmlRootElement(name = "Product") @XmlType(name="",propOrder={"productName","productVersion",..."propN"}) 

    … certes je n’en ai pas assez de POURQUOI ça marche! 🙂

    De ce fait , l’ordre des éléments XML frères n’est pas garanti.

    Ajoutez simplement :

     @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder={"field1", "field2", ...}) 

    Dans @XmlType(propOrder={"prop1", "prop2"}) vous ne pouvez déclarer que propertyName vous avez déclaré dans la classe. Vous ne pouvez pas déclarer

     XMLElement name ( @XmlElement(name="Company")) 

    dans le XmlType propOrder mentionné ci-dessus ..

    Vous devez append les propOrder et XmlAccessType à la classe.

     @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})