64 votes

JAXB et l'ordre des propriétés

Je veux que la sortie XML sérialisée de ma classe Java respecte l'ordre des propriétés de la classe Java.

Il semble que JAXB ordonne par ordre alphabétique.

Je peux contourner cela en utilisant @XmlType con 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 le fait de spécifier un propOrder le ferait mais ce n'est pas le cas.

Ma classe d'exemple :

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 String company;
    private String scheme;
    private String agreementNumber;

    @XmlElement(name="Company")
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }

    @XmlElement(name="Scheme")
    public String getScheme() {
        return scheme;
    }
    public void setScheme(String scheme) {
        this.scheme = scheme;
    }

    @XmlElement(name="AgreementNumber")
    public String getAgreementNumber() {
        return agreementNumber;
    }
    public void setAgreementNumber(String 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 :

    <customerPlan2>
      <AgreementNumber>agreementnumber</AgreementNumber> 
      <Company>company</Company> 
      <Scheme>scheme</Scheme> 
    </customerPlan2>

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

    <customerPlan2>
      <Company>company</Company>
      <Scheme>scheme</Scheme> 
      <AgreementNumber>agreementnumber</AgreementNumber> 
    </customerPlan2>

Merci pour toute aide à ce sujet.

71voto

VIVEK PANDIAN S Points 281

C'est possible en utilisant :

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

Il suffit de décommenter le code comme ceci :

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

C'est l'usage correct.

25voto

Blaise Doughan Points 75613

Note : Je dirige EclipseLink JAXB (MOXy)

L'ordre dans lequel la réflexion 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 fournit pas de commande garantie . Cependant, la plupart des implémentations JAXB (sinon toutes) utilisent l'ordre alphabétique car il est déterministe. Pour garantir cet ordre, vous devez annoter votre classe comme suit :

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
    ...
}

5voto

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

C'est correct, mais avez-vous essayé ceci ?

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

3voto

Doug Points 43

Ce fil de discussion est ancien, mais il vaut la peine d'expliquer comment j'ai réussi à faire en sorte que mes propriétés génèrent du xml dans l'ordre approprié, sans utiliser l'ordre alphabétique, qui n'était pas souhaité. Une chose à noter est que j'utilise wink et jaxb qui peuvent se comporter différemment des autres fournisseurs. Wink était très spécifique sur ce qui était dans la liste des propriétés. Même les éléments que j'ai marqués comme étant des éléments transitoires xml, ou pas du tout décorés, devaient faire partie de la liste

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

...il est vrai que je ne sais pas assez pourquoi cela fonctionne :)

1voto

Davidann Points 3405

Selon ce l'ordre des éléments XML apparentés n'est pas garanti.

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