2012-01-12 11 views
6

मैं जेएक्सबी का उपयोग करने के लिए कुछ कोड दोबारा कर रहा हूं और क्लाइंट को आउटपुट कोड में प्रतिबिंबित कर रहा हूं, यह वर्तमान में एक्सएमएलवाइटर का उपयोग कर रहा है और प्रत्येक बार मैन्युअल रूप से टैग बना रहा है।क्या आप JAXB में शून्य योग्य विशेषता का डिफ़ॉल्ट मान बदल सकते हैं?

मेरी समस्या यह है कि क्लाइंट पक्ष पर बाधाओं के कारण, मुझे जावा क्लास में किसी भी शून्य फ़ील्ड के लिए एक्सएमएल में रिक्त तत्व होना चाहिए।

जबकि मुझे एहसास है कि प्रत्येक समस्या को nillable=true प्रत्येक JAXB XmlElement एनोटेशन में जोड़कर हल किया जा सकता है, यह सबसे व्यावहारिक नहीं है, क्योंकि मेरे पास बहुत सी टिप्पणियां हैं।

मैं वैश्विक विशेषता (या डिफ़ॉल्ट मान के रूप में) nillable=true सेट करने का एक तरीका ढूंढने की उम्मीद कर रहा था। इससे भविष्य के सहयोगियों के लिए भी काम करना आसान हो जाएगा, क्योंकि उन्हें यह याद रखने की आवश्यकता नहीं होगी कि प्रत्येक एनोटेशन में nillable विशेषता शामिल होनी चाहिए।

मुझे डिफ़ॉल्ट व्यवहार के विवरण के अलावा बहुत कुछ नहीं मिला है। मुझे यह आश्चर्य की बात है कि किसी और ने अतीत में एक समान प्रश्न पोस्ट नहीं किया है। जो मैंने पाया है, उससे मुझे ऐसा प्रतीत नहीं होता है कि डिफ़ॉल्ट कॉन्फ़िगर करने योग्य बनाने के लिए कोई अंतर्निहित समर्थन है। क्या यह ऐसा कुछ है जिसे कस्टम जेएक्सबी कार्यान्वयन या शायद एक तीसरी पार्टी जेएक्सबी कार्यान्वयन के साथ हल किया जा सकता है?

उत्तर

1

नोट: मैं EclipseLink JAXB (MOXy) नेतृत्व और JAXB 2 (JSR-222) विशेषज्ञ समूह का सदस्य हूँ।

मैं इस व्यवहार के लिए एक वृद्धि अनुरोध दर्ज किया है EclipseLink JAXB (MOXY) को जोड़ा गया:

को हल करने के

सब करता है, तो चारों ओर एक काम के रूप में अपने मैप किए गए स्ट्रिंग फ़ील्ड्स/गुणों को एक्सएमएल तत्वों में मैप किया जाता है, तो निम्न XmlAdapter दृष्टिकोण आपके लिए काम कर सकता है:

NullStringAdapter

यह XmlAdapterString के उदाहरण मार्शल के रूप में एक वस्तु AdaptedString कहा जाता है। AdaptedString में String मूल्य और xsi:nil विशेषता के लिए मैप किए गए फ़ील्ड शामिल हैं। XmlAdapter में हम उस क्षेत्र का मान निर्धारित करेंगे कि String मान शून्य है या नहीं।

package forum8841221; 

import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.*; 

public class NullStringAdapter extends XmlAdapter<NullStringAdapter.AdaptedString, String> { 

    @Override 
    public AdaptedString marshal(String v) throws Exception { 
     AdaptedString adaptedString = new AdaptedString(); 
     if(null == v) { 
      adaptedString.nil = true; 
     } 
     adaptedString.value = v; 
     return adaptedString; 
    } 

    @Override 
    public String unmarshal(AdaptedString v) throws Exception { 
     return v.value; 
    } 

    public static class AdaptedString { 

     @XmlAttribute(namespace="http://www.w3.org/2001/XMLSchema-instance") 
     public Boolean nil; 

     @XmlValue 
     @XmlJavaTypeAdapter(VoidStringAdapter.class) 
     public String value; 

    } 

    public static class VoidStringAdapter extends XmlAdapter<String, String> { 

     @Override 
     public String marshal(String v) throws Exception { 
      return v; 
     } 

     @Override 
     public String unmarshal(String v) throws Exception { 
      return v; 
     } 

    } 

} 

पैकेज-जानकारी

हम रजिस्टर कर सकते हैं कि हम इस XmlAdapter पैकेज स्तर पर XmlAdapter पंजीकरण से सभी मैप की String क्षेत्रों/इस पैकेज पर गुण को लागू करना चाहते।

@XmlJavaTypeAdapter(value=NullStringAdapter.class, type=String.class) 
@XmlSchema(xmlns={@XmlNs(namespaceURI = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi")}) 
package forum8841221; 

import javax.xml.bind.annotation.adapters.*; 
import javax.xml.bind.annotation.*; 

रूट

नीचे डोमेन वर्ग मैं इस उदाहरण के लिए इस्तेमाल किया गया है।यह कई स्ट्रिंग गुण है, उनमें से एक @XmlElement (nillable = true)

package forum8841221; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Root { 

    private String a; 
    private String b; 
    private String c; 
    private String d; 

    public String getA() { 
     return a; 
    } 

    public void setA(String a) { 
     this.a = a; 
    } 

    public String getB() { 
     return b; 
    } 

    public void setB(String b) { 
     this.b = b; 
    } 

    public String getC() { 
     return c; 
    } 

    public void setC(String c) { 
     this.c = c; 
    } 

    @XmlElement(nillable=true) 
    public String getD() { 
     return d; 
    } 

    public void setD(String d) { 
     this.d = d; 
    } 

} 

डेमो

package forum8841221; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Root root = new Root(); 
     root.setB("B"); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

आउटपुट के साथ टिप्पणी की जाती है

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <a xsi:nil="true"/> 
    <b>B</b> 
    <c xsi:nil="true"/> 
    <d xsi:nil="true"/> 
</root> 
संबंधित मुद्दे