Подтвердить что ты не робот

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>

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

4b9b3361

Ответ 1

Возможно использование:

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

... По общему признанию, мне не хватает ПОЧЕМУ оно работает!:)

Ответ 5

В соответствии с this, порядок XML-элементов sibling не гарантируется.

Ответ 6

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

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

Ответ 7

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

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

в XmlType propOrder, как упоминалось выше.

Ответ 8

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

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})