首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JAXB和属性排序

JAXB和属性排序
EN

Stack Overflow用户
提问于 2011-03-26 00:18:22
回答 8查看 90K关注 0票数 72

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

似乎JAXB是按字母顺序排序的。

我可以通过使用带有propOrder的@XmlType并指定所有属性来覆盖它,但是我有一个具有许多属性的类,这些属性还没有完成。

我读到指定一个空的propOrder可以做到这一点,但事实并非如此。

我的示例类:

代码语言:javascript
复制
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;
    }
}

我的序列化代码:

代码语言:javascript
复制
    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"));

输出:

代码语言:javascript
复制
    <customerPlan2>
      <AgreementNumber>agreementnumber</AgreementNumber> 
      <Company>company</Company> 
      <Scheme>scheme</Scheme> 
    </customerPlan2>

我希望我的输出是(作为我的类的属性顺序):

代码语言:javascript
复制
    <customerPlan2>
      <Company>company</Company>
      <Scheme>scheme</Scheme> 
      <AgreementNumber>agreementnumber</AgreementNumber> 
    </customerPlan2>

谢谢你在这方面的帮助。

EN

回答 8

Stack Overflow用户

发布于 2011-06-08 15:21:58

可以使用:

代码语言:javascript
复制
@XmlType (propOrder={"prop1","prop2",..."propN"})

只需像这样取消对代码的注释:

代码语言:javascript
复制
//@XmlType(propOrder={"company", "scheme", "agreementNumber"})

这是正确的用法。

票数 78
EN

Stack Overflow用户

发布于 2011-03-26 00:34:14

注:我领导EclipseLink JAXB (MOXy)

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

缺省情况下,JAXB提供no guaranteed ordering。但是,大多数(如果不是所有的JAXB实现)都使用字母顺序,因为它是确定性的。要保证这种排序,您必须按如下方式注释您的类:

代码语言:javascript
复制
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
    ...
}
票数 27
EN

Stack Overflow用户

发布于 2014-02-17 19:57:01

代码语言:javascript
复制
@XmlType(propOrder={"company", "scheme", "agreementNumber"})

这是正确的,但是你试过这个吗?

代码语言:javascript
复制
@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5435138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档