JAXB和物业订购

and*_*lam 64 java jaxb xml-binding

我希望我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的序列化代码:

    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"));
Run Code Online (Sandbox Code Playgroud)

输出:

    <customerPlan2>
      <AgreementNumber>agreementnumber</AgreementNumber> 
      <Company>company</Company> 
      <Scheme>scheme</Scheme> 
    </customerPlan2>
Run Code Online (Sandbox Code Playgroud)

我希望我的输出(作为我班级的属性顺序):

    <customerPlan2>
      <Company>company</Company>
      <Scheme>scheme</Scheme> 
      <AgreementNumber>agreementnumber</AgreementNumber> 
    </customerPlan2>
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助.

小智 69

可以使用:

@XmlType (propOrder={"prop1","prop2",..."propN"})
Run Code Online (Sandbox Code Playgroud)

只需取消注释代码:

//@XmlType(propOrder={"company", "scheme", "agreementNumber"})
Run Code Online (Sandbox Code Playgroud)

这是正确的用法.


bdo*_*han 25

注意:我领导EclipseLink JAXB(MOXy)

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

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

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
    ...
}
Run Code Online (Sandbox Code Playgroud)


小智 5

@XmlType(propOrder={"company", "scheme", "agreementNumber"})
Run Code Online (Sandbox Code Playgroud)

这是对的,但你试过这个吗?

@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
Run Code Online (Sandbox Code Playgroud)