web-dev-qa-db-fra.com

JAXB et la commande de propriété

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

Il semble que JAXB ordonne par ordre alphabétique.

Je peux remplacer ceci 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 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 de propriété de ma classe):

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

Merci pour toute aide à ce sujet.

60
andy hallam

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.

65
VIVEK PANDIAN S

Remarque: je mène EclipseLink JAXB (MOXy)

L'ordre dans lequel Java reflect 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 aucune commande garantie . Cependant, la plupart (sinon toutes les implémentations JAXB) utilisent un ordre alphabétique puisqu'il est déterministe. Pour garantir cette commande, vous devez annoter votre classe comme suit:

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

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

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

Ce fil est ancien, mais il vaut la peine de dire comment mes propriétés ont généré XML dans le bon ordre et NON en utilisant un ordre alphabétique, car cela n’était 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 des biens. Même les éléments que je marque comme transitoires xml, ou pas décorés du tout étaient tenus de faire partie de

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

... certes je ne sais pas assez pourquoi ça marche! :)

3
Doug

Selon this , l'ordre des éléments XML frères n'est pas garanti.

1
Weiser

Il suffit d'ajouter : 

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

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

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

dans la XmlTypepropOrder mentionnée ci-dessus ..

0
gubs