[Java] JAXB और संपत्ति क्रम


Answers

नोट: मैं EclipseLink JAXB (MOXy) का नेतृत्व करता हूँ

जिस आदेश में जावा रिफ्लेक्शन फ़ील्ड / प्रॉपर्टी की सूची देता है, उसकी गारंटी नहीं है। यही कारण है कि जेएएएसबी के कार्यान्वयन तत्व क्रम को निर्धारित करने के लिए इसका उपयोग नहीं करते हैं।

डिफ़ॉल्ट रूप से JAXB गारंटीकृत आदेश प्रदान नहीं करता है। हालांकि अधिकांश (यदि सभी जेएएएसबी लागू नहीं हैं) वर्णक्रमानुसार आदेश का उपयोग करते हैं क्योंकि यह नियतात्मक है इस आदेश की गारंटी के लिए आपको अपने वर्ग को इस प्रकार टिप्पणी देना होगा:

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

मैं जावा वर्ग में गुणों के क्रम को सम्मानित करने के लिए अपने जावा वर्ग से क्रमबद्ध XML आउटपुट चाहता हूं।

ऐसा लगता है कि जेएसीएबी ने वर्णानुक्रम से आदेश दिए

मैं इसे @XmlType साथ @ @XmlType का उपयोग करके और सभी गुणों को निर्दिष्ट करके ओवरराइड कर सकता हूं, लेकिन मेरे पास कई गुण हैं और ये अभी तक अंतिम रूप नहीं हैं।

मैंने पढ़ा है कि एक खाली प्रोपोडर निर्दिष्ट करने से ऐसा होता है लेकिन ऐसा नहीं होता।

मेरा उदाहरण वर्ग:

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>

इस पर किसी भी मदद के लिए धन्यवाद।




यह धागा पुराना है लेकिन फेंकने के लायक है कि मैं अपने गुणों को उचित क्रम में एक्सएमएल बनाने के लिए कैसे प्राप्त करता हूं और वर्णमाला क्रम के इस्तेमाल से नहीं कह रहा हूं क्योंकि यह अवांछित था। ध्यान देने योग्य बात यह है कि मैं पलक और जेकब का उपयोग कर रहा हूं जो अलग-अलग व्यवहार कर सकता है, अन्य प्रदाताओं। वेंक विशेष रूप से संपत्ति सूची में क्या था के बारे में विशिष्ट था। यहां तक ​​कि उन तत्वों को मैं एक्सएमएल क्षणिक के रूप में चिह्नित करता हूं, या सभी पर सजाया नहीं गया था

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

... बेशक मुझे पर्याप्त काम नहीं करता है!




बस जोड़ दो :

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



आपको propOrder में propOrder और XmlAccessType एनोटेशन जोड़ना होगा

@XmlAccessorType(XmlAccessType.FIELD)

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