【问题标题】:JAXB and property orderingJAXB 和属性排序
【发布时间】:2011-07-23 01:13:32
【问题描述】:

我希望我的 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>

感谢您对此的任何帮助。

【问题讨论】:

    标签: java jaxb xml-binding


    【解决方案1】:

    可以使用:

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

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

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

    这是正确的用法。

    【讨论】:

    【解决方案2】:

    注意:我领导EclipseLink JAXB (MOXy)

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

    默认情况下,JAXB 提供no guaranteed ordering。然而,大多数(如果不是所有的 JAXB 实现)都使用字母顺序,因为它是确定性的。为了保证这种排序,您必须对您的类进行如下注释:

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

    【讨论】:

    • 这是否也适用于从您的超类继承的属性?
    • 我这样做了,在一个环境中运行编组时得到了反向 alpha 排序,而在另一个环境中运行编组时得到了正常的 alpha 排序。有什么想法/建议吗?
    【解决方案3】:
    @XmlType(propOrder={"company", "scheme", "agreementNumber"})
    

    没错,但你试过吗?

    @XmlType(propOrder={"Company", "Scheme", "AgreementNumber"})
    

    【讨论】:

      【解决方案4】:

      这个线程很旧,但值得一提的是我如何让我的属性以正确的顺序生成 xml,而不是使用字母顺序,因为这是不受欢迎的。需要注意的一件事是,我正在使用 wink 和 jaxb,它们的行为可能与其他提供商不同。 Wink 对属性列表中的内容非常具体。即使是我标记为 xml 瞬态的元素,或者根本没有修饰的元素也需要成为其中的一部分

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

      ...诚然,我对它的工作原理还不够了解!:)

      【讨论】:

      • 不需要XmlType注解中的name属性,只需要propOrder属性即可,即@XmlType(propOrder={"productName","productVersion",..."propN"})
      【解决方案5】:

      根据this,不保证兄弟XML元素的顺序。

      【讨论】:

        【解决方案6】:

        只需添加:

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

        【讨论】:

          【解决方案7】:

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

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

          在上面提到的XmlTypepropOrder..

          【讨论】:

            【解决方案8】:

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

            @XmlAccessorType(XmlAccessType.FIELD)
            
            @XmlType(propOrder = {"PartyType","PartyName","PartyAddress"})
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-05-06
              • 2015-04-29
              • 1970-01-01
              • 2017-10-22
              • 2013-04-16
              • 2012-06-06
              相关资源
              最近更新 更多