JAXB и заказ недвижимости

Я хочу, чтобы сериализованный вывод XML из моего Java-класса учитывал порядок свойств в Java-классе.

Кажется, что JAXB заказывает в алфавитном порядке.

Я могу переопределить это с помощью @XmlType с propOrder и указанием ВСЕХ свойств, но у меня есть класс со многими свойствами, и они еще не завершены.

Я читал, что указание пустого propOrder будет делать это, но это не так.

Мой пример класса:

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

Мой код сериализации:

    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"));

Выход:

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

Я хочу, чтобы мой вывод был (как порядок свойств моего класса):

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

Спасибо за любую помощь в этом.

9 ответов

Это возможно с помощью:

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

Просто раскомментируйте код следующим образом:

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

Это правильное использование.

Примечание: я веду EclipseLink JAXB (MOXy)

Порядок, в котором отражение Java возвращает список полей / свойств, не гарантируется. Вот почему реализации JAXB не используют его для определения порядка элементов.

По умолчанию JAXB не предоставляет гарантированного заказа. Однако большинство (если не все реализации JAXB) используют алфавитный порядок, поскольку он является детерминированным. Чтобы гарантировать этот порядок, вы должны аннотировать свой класс следующим образом:

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

Это правильно, но вы пробовали это?

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

Эта ветка старая, но стоит рассказать о том, как я получил свои свойства для генерации XML в правильном порядке, а НЕ с использованием алфавитного порядка, так как это нежелательно. Стоит отметить, что я использую wink и jaxb, которые могут вести себя не так, как другие провайдеры. Wink был очень конкретным о том, что было в надлежащем списке. Даже элементы, которые я отмечаю как временные или неукрашенные как xml, должны были быть частью

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

... по общему признанию мне не достаточно ПОЧЕМУ это работает!:)

В @XmlType(propOrder={"prop1", "prop2"}) Вы можете объявить только propertyName Вы объявлены в классе. Вы не можете объявить

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

в XmlTypepropOrder как упомянуто выше..

Просто добавь:

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

В соответствии с этим порядок родственных элементов XML не гарантируется.

Это правильно: пожалуйста, раскомментируйте строку ниже

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

Вы должны добавить propOrder и XmlAccessType аннотации к классу.

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})
Другие вопросы по тегам