JAXB和属性订购


69

我希望Java类中的序列化XML输出能够遵循Java类中属性的顺序。

似乎JAXB按字母顺序排序。

我可以通过@XmlTypepropOrder一起使用并指定所有属性来覆盖此属性,但是我有一个包含许多属性的类,而这些属性尚未最终确定。

我读到,指定一个空的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>

感谢您对此的任何帮助。

Answers:



27

注意:我领导EclipseLink JAXB(MOXy)

不保证Java反射返回字段/属性列表的顺序。这就是JAXB实现不使用它来确定元素顺序的原因。

默认情况下,JAXB不提供有保证的排序。但是,大多数(如果不是所有JAXB实现)都使用字母顺序,因为它是确定性的。为了保证此顺序,您必须按如下方式注释您的班级:

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

1
这也应该与您超类的继承属性一起使用吗?
塞巴斯蒂安·特朗2015年

我这样做是在一个环境中运行编组时获得了反向Alpha排序,而在另一环境中运行了编组时获得了正常的Alpha排序。有什么想法/建议吗?
Achilles929


3

该线程很旧,但是值得抛出我如何获取属性以正确的顺序生成xml的信息,而不是不希望使用字母顺序的。需要注意的一件事是,我使用的wink和jaxb的行为可能与其他提供程序不同。Wink对于适当列表中的内容非常具体。甚至我标记为xml瞬态的元素或根本没有修饰的元素都必须是其中的一部分

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

...诚然,我对为什么它还不够了解!:)


1
不需要XmlType批注中的name属性,只需propOrder属性就足够了,即@XmlType(propOrder = {“ productName”,“ productVersion”,...“ propN”})
迈克尔


1

只需添加:

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

1

@XmlType(propOrder={"prop1", "prop2"})您只能声明propertyName您在类中声明的。你不能宣布

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

在里面 XmlType propOrder上面提到的


-1

您必须将propOrderXmlAccessType注释添加到类中。

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.