web-dev-qa-db-ja.com

JAXBおよびプロパティの順序付け

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>

これについて助けてくれてありがとう。

63
andy hallam

以下を使用して可能です。

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

このようなコードのコメントを外してください:

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

これは正しい使い方です。

68
VIVEK PANDIAN S

注:リード EclipseLink JAXB(MOXy)

Javaリフレクションがフィールド/プロパティのリストを返す順序は保証されません。これが、JAXB実装が要素の順序を決定するためにそれを使用しない理由です。

デフォルトでは、JAXBは 保証された順序付けなし を提供します。ただし、確定的であるため、ほとんどの(すべてのJAXB実装ではないにしても)アルファベット順を使用します。この順序を保証するには、次のようにクラスに注釈を付ける必要があります。

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Foo {
    ...
}
25
bdoughan
@XmlType(propOrder={"company", "scheme", "agreementNumber"})

正しいですが、これを試しましたか?

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

このスレッドは古いですが、適切な順序でxmlを生成するためにプロパティを取得した方法を投げる価値があり、それは望ましくないため、アルファベット順を使用していません。注意すべきことの1つは、他のプロバイダーとは異なる動作をする可能性のあるwinkとjaxbを使用していることです。ウィンクは、適切にリストされているものについて非常に具体的でした。 XMLトランジェントとしてマークした要素、またはまったく装飾されていない要素でさえ、

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

...確かに、なぜそれが機能するのか十分ではありません!:)

3
Doug

追加するだけです:

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

this によれば、兄弟のXML要素の順序は保証されていません。

1
David Weiser

@XmlType(propOrder={"prop1", "prop2"})では、クラスで宣言したpropertyNameのみを宣言できます。宣言できません

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

上記のXmlTypepropOrderで。

0
gubs