2012-10-01 20 views
8

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

जनक वर्ग:

@XmlType(name="Request") 
@XmlAccessorType(XmlAccessorType.NONE) 
public abstract class Request { 
    @XmlElement(required=true) 
    private UUID uuid; 

    ... setter/getter 
} 
अब उपवर्ग के लिए

:

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data1; 

    ... setters/getters ... 
} 

जब मैं ConcreteClass का एक उदाहरण मैं निम्न XML मिल masrhall:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <uuid>uuid</uuid> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

मैं कहां से एक्सएमएल चाहते इस तरह:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

हमारे पास अनुरोध के अन्य कार्यान्वयन हैं, हालांकि यूयूआईडी की आवश्यकता है, यह सिर्फ एक विशेष मामला है। क्या मेरे ConcreteRequest में UUID फ़ील्ड को अनदेखा करने का कोई तरीका है?

उत्तर

6

मुझे उम्मीद है, मैं आपकी समस्या को समझ गया हूं। यहां समाधान है।

जेएक्सबी @XmlTransient(javax.xml.bind.annotation.XmlTransient)(javadoc) प्रदान करता है ताकि मार्शलिंग के दौरान किसी भी क्षेत्र को अनदेखा किया जा सके।

अवहेलना क्षेत्र "UUID" अपने व्युत्पन्न वर्ग (ConcreteRequest.class) मेंरूप @XmlTransient अपने correspoding मनुष्य/सेटर विधि के साथ। गेटटर/सेटर विधियों को ओवरराइड करना भी आवश्यक है, इन्हें मार्शलिंग के दौरान बुलाया जाएगा।

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data2; 
    @XmlTransient 
    private UUID uuid; 

    ... setters/getters ... 
} 

यह आपके बेस क्लास विशेषता को ओवरराइड करेगा।

अधिक जानकारी के लिए मेरे पास वापस आएं।

+0

दुर्भाग्य से मुझे नहीं लगता कि यह मेरी स्थिति में संभव है। यूयूआईडी क्षेत्र हमारे डेटाबेस में जारी है इसलिए ओवरराइडिंग यह खतरनाक होगा। असल में मेरी कक्षा एक विशेष उप-वर्ग है जहां इसकी एक यूयूआईडी है लेकिन यह एक्सएमएल स्कीमा से संबंधित नहीं है। – prozaak

+0

मेरे विश्लेषण से, जेएक्सबी आपकी आवश्यकता के लिए एक उपयुक्त विकल्प प्रदान नहीं करता है, मैं सुझाव दूंगा कि जेएक्सबी व्यवहार का उपयोग करना है - "@XmlElement (nillable = false)" के दौरान शून्य मान तत्व को अनदेखा कर दिया जाएगा। इसलिए, मार्शलिंग के समय मूल्य "यूयूआईडी" की व्याख्या को शून्य के रूप में बनाते हैं, ताकि यह मार्शलिंग के दौरान संपत्ति का निर्माण न करे। मेरे पास कोड का नमूना टुकड़ा है लेकिन यहां साझा नहीं किया जा सका। – omega

+0

यह सिर्फ काम नहीं करता है। – GoalBased

0

आप व्युत्पन्न वर्ग पर

@XmlAccessorType(XmlAccessType.NONE) 
माता पिता वर्ग पर

, और

@XmlAccessorType(XmlAccessType.FIELD) 

उपयोग कर सकते हैं।