JAXB и заказ недвижимости - PullRequest
62 голосов
/ 25 марта 2011

Я хочу, чтобы сериализованный вывод 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>

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

Ответы [ 8 ]

67 голосов
/ 08 июня 2011

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

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

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

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

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

25 голосов
/ 25 марта 2011

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

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

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

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
    ...
}
5 голосов
/ 17 февраля 2014
@XmlType(propOrder={"company", "scheme", "agreementNumber"})

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

@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
3 голосов
/ 17 августа 2012

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

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

... правда, мне не хватает того, ПОЧЕМУ это работает! :) 1004 *

1 голос
/ 09 декабря 2014

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

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"field1", "field2", ...})
1 голос
/ 25 марта 2011

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

0 голосов
/ 19 августа 2016

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

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})
0 голосов
/ 16 мая 2014

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

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

в XmlType propOrder, как упомянуто выше ..

...