2012-01-24 12 views
6

शून्य मैं एक वस्तु के रूप एनोटेट में एक स्ट्रिंग संपत्ति है इस प्रकार है:JAXB - कोई xsi के साथ रिक्त टैग्स:

@XmlElement(name = "Item", required = true, nillable = true) 
private String item; 

marshaling के बाद परिणाम

<Item xsi:nil="true"/> 

है, जबकि मैं इसे चाहते हैं होने के लिए

<Item/> 

क्योंकि मेरे एक्सएमएल संदेशों को स्वीकार करने वाली तीसरी पार्टी सेवा इसे बाद के मामले की तरह चाहती है। मैं jaxb2 का उपयोग कर रहा हूँ। क्या कोई जानता है कि मैं यह कैसे कर सकता हूं?

धन्यवाद एक बहुत

उत्तर

1

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

निम्नलिखित उदाहरण के लिए MOXy के उपयोग को JAXB प्रदाता के रूप में उपयोग करने की आवश्यकता है। ऐसा इसलिए है क्योंकि जब क्षेत्र/संपत्ति शून्य है तो JAXB RI XmlAdapter पर कॉल नहीं करता है। MOXY अपने JAXB प्रदाता के रूप में निर्दिष्ट करने के बारे में जानकारी के लिए देखें:

StringAdapter

XmlAdapter एक संपत्ति @XmlValue साथ एनोटेट के साथ एक वस्तु के लिए स्ट्रिंग मान परिवर्तित कर देंगे।

package forum8986842; 

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

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

    @Override 
    public String unmarshal(AdaptedString adaptedString) throws Exception { 
     if(null == adaptedString) { 
      return null; 
     } 
     String string = adaptedString.value; 
     if("".equals(string)) { 
      return null; 
     } 
     return string; 
    } 

    @Override 
    public AdaptedString marshal(String string) throws Exception { 
     AdaptedString adaptedString = new AdaptedString(); 
     adaptedString.value = string; 
     return adaptedString; 
    } 

    public static class AdaptedString { 
     @XmlValue public String value; 
    } 

} 

रूट

@XmlJavaTypeAdapter एनोटेशन निर्दिष्ट करने के लिए प्रयोग किया जाता है XmlAdapter:

package forum8986842; 

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

@XmlRootElement(name="Root") 
public class Root { 

    private String item; 

    @XmlElement(name = "Item", required = true, nillable = true) 
    @XmlJavaTypeAdapter(StringAdapter.class) 
    public String getItem() { 
     return item; 
    } 

    public void setItem(String item) { 
     this.item = item; 
    } 

} 

डेमो

निम्नलिखित कोड ऊपर मानचित्रण प्रदर्शित करने के लिए इस्तेमाल किया जा सकता। दो दस्तावेज़ों का उपयोग खाली Item तत्व के साथ किया जाता है, और दूसरा एक जनसंख्या Item तत्व के साथ।

package forum8986842; 

import java.io.StringReader; 
import javax.xml.bind.*; 

public class Demo { 

    private JAXBContext jc; 

    public Demo() throws JAXBException { 
     jc = JAXBContext.newInstance(Root.class); 
    } 

    public static void main(String[] args) throws Exception { 
     Demo demo = new Demo(); 
     demo.demo("<Root><Item/></Root>"); 
     demo.demo("<Root><Item>Hello World</Item></Root>"); 
    } 

    private void demo(String xml) throws JAXBException { 
     System.out.println("\n\nINPUT: " + xml); 
     StringReader stringReader = new StringReader(xml); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Root root = (Root) unmarshaller.unmarshal(stringReader); 

     System.out.println("ITEM: " + root.getItem()); 

     System.out.print("OUTPUT: "); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

आउटपुट

निम्नलिखित है डेमो कोड को चलने से उत्पादन:

INPUT: <Root><Item/></Root> 
ITEM: null 
OUTPUT: <Root><Item/></Root> 

INPUT: <Root><Item>Hello World</Item></Root> 
ITEM: Hello World 
OUTPUT: <Root><Item>Hello World</Item></Root> 

अधिक जानकारी के लिए

0

मैं बदल रहा XSD आसान था पाया

<xs:element name="name"> 
    <xs:complexType/> 
</xs:element> 

और अपने कोड में, जब आप ऑटो अपने जावा src/वर्गों उत्पन्न

आप नए नाम निर्दिष्ट करना होगा और जिस नाम पर ऑब्जेक्ट नाम

के अंतर्गत है, नाम सेट करें
संबंधित मुद्दे