2011-03-25 81 views
55

我想從我的Java類的序列化的XML輸出,以遵守Java類中的屬性的順序。JAXB和財產訂購

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> 

感謝您的任何幫助。

回答

22

注:我帶領EclipseLink JAXB (MOXy)

在Java反射返回的字段列表的順序/性能無法得到保證。這就是JAXB實現不使用它來確定元素順序的原因。

默認情況下,JAXB提供no guaranteed ordering。然而,大多數(如果不是所有的JAXB實現)都使用字母排序,因爲它是確定性的。爲了保證這個命令你必須註解類,如下所示:

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

這是否也適用於您的超類的繼承屬性? – 2015-12-08 09:52:48

+0

我做到了這一點,並且在一個環境中運行編組時以及在另一個環境中運行編組時正常的字母順序,獲得了逆向alpha排序。任何想法/建議? – Achilles929 2016-10-04 21:11:28

59

有可能使用:

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

就取消註釋這樣的代碼:

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

這是正確的用法。

+0

True:http://jaxb.java.net/tutorial/section_6_2_2-Annotation-for-Classes-XmlType.html#Annotation%20for%20Classes:%20XmlType – 2013-02-28 10:30:09

3

這個線程是舊的,但值得扔我得到了我的屬性來生成正確的順序XML和不使用字母排序因爲這是不需要的。需要注意的一點是,我用眼色並會有不同的表現,然後其他供應商JAXB。 Wink對於財產清單中的內容非常具體。即使我的元素標記爲XML短暫的,或不飾都被要求是

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

一部分......誠然我做得遠遠不夠,爲什麼它的工作原理!:)

+1

XmlType註釋中的name屬性不是必需的,只是propOrder屬性就足夠了,即@XmlType(propOrder = {「productName」,「productVersion」,...「propN」}) – Michael 2014-01-29 18:28:43

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

這是正確,但你有沒有嘗試過?

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

@XmlType(propOrder={"prop1", "prop2"})你可以聲明只propertyName您在類中聲明。你不能用如上述提到的XmlTypepropOrder聲明

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

..

1

只需添加:

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

你必須在propOrderXmlAccessType標註添加到類。

@XmlAccessorType(XmlAccessType.FIELD) 

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"}) 
+0

downvote:duplicate – Murmel 2016-09-09 20:31:35