2013-12-13 8 views
5

मुझे विरासत वाली वस्तुओं की सूची के लिए "अच्छा" एक्सएमएल और जेएसओएन उत्पन्न करने के लिए मोक्सी प्राप्त करने में समस्या है। एक्सएमएल में से कोई भी दिखता है या JSON ठीक दिखता है, लेकिन एक ही समय में नहीं।मोक्सी: ऑब्जेक्ट्स की सूची एक्सएमएल और जेएसओएन दोनों अच्छी लगती नहीं हैं

public static abstract class Animal { 
    private String name; 

    protected Animal() { 
    } 
    protected Animal(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 
@XmlRootElement 
public static class Tiger extends Animal { 
    public Tiger() { 
    } 
    public Tiger(String name) { 
     super(name); 
    } 
} 

@XmlRootElement 
public static class Lion extends Animal { 
    public Lion() { 
    } 
    public Lion(String name) { 
     super(name); 
    } 
} 

@XmlRootElement 
public static class Zoo { 
    private List<Animal> animals = new ArrayList<>(); 

    @XmlElementRef 
    public List<Animal> getAnimals() { 
     return animals; 
    } 
    public void setAnimals(List<Animal> animals) { 
     this.animals = animals; 
    } 
    public void addAnimal(Animal a) { 
     animals.add(a); 
    } 
} 

XML और JSON निम्नलिखित चिड़ियाघर उदाहरण

zoo = new Zoo(); 
    zoo.addAnimal(new Tiger("Hobbes")); 
    zoo.addAnimal(new Lion("Simba")); 
    zoo.addAnimal(new Tiger("Sherikan")); 

देखो की तरह से उत्पन्न:: यहाँ मॉडल है

<?xml version="1.0" encoding="UTF-8"?> 
    <zoo> 
    <tiger> 
     <name>Hobbes</name> 
    </tiger> 
    <lion> 
     <name>Simba</name> 
    </lion> 
    <tiger> 
     <name>Sherikan</name> 
    </tiger> 
    </zoo> 
    { 
    "zoo" : { 
     "tiger" : [ { 
      "name" : "Hobbes" 
     }, { 
      "name" : "Sherikan" 
     } ], 
     "lion" : [ { 
      "name" : "Simba" 
     } ] 
    } 
    } 

एक्सएमएल वास्तव में लग रहा है कि मैं क्या यह भी चाहते हैं, लेकिन जेएसओएन अजीब है। जिस तरह से मोक्सी कुंजी के रूप में प्रकार का उपयोग करता है वह सूची में तत्वों के बीच क्रम को संरक्षित नहीं करता है। क्या यह एक बग या फीचर है?

यदि मैं Zoo.animals पर @XmlElement पर एनोटेशन बदलता हूं तो JSON आउटपुट ठीक दिखता है, लेकिन एक्सएमएल आउटपुट कुछ ऐसा बदल गया है जिसका मैं उपयोग नहीं कर सकता।

{ 
    "zoo" : { 
     "animals" : [ { 
      "type" : "tiger", 
      "name" : "Hobbes" 
     }, { 
      "type" : "lion", 
      "name" : "Simba" 
     }, { 
      "type" : "tiger", 
      "name" : "Sherikan" 
     } ] 
    } 
    } 
    <?xml version="1.0" encoding="UTF-8"?> 
    <zoo> 
    <animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tiger"> 
     <name>Hobbes</name> 
    </animals> 
    <animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="lion"> 
     <name>Simba</name> 
    </animals> 
    <animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tiger"> 
     <name>Sherikan</name> 
    </animals> 
    </zoo> 

एक ही रास्ता है कि मैं इस को हल करने के साथ आए हैं Zoo.animals पर एनोटेशन ओवरराइड करने के लिए एक बाहरी OXM बाध्यकारी फ़ाइल बनाने के लिए है। नीचे बाध्यकारी JAXBContextProperties.OXM_METADATA_SOURCE की संपत्ति का उपयोग करके पंजीकृत है।

<?xml version="1.0"?> 
    <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xml-accessor-type="PUBLIC_MEMBER" xml-accessor-order="ALPHABETICAL" 
       xml-mapping-metadata-complete="false" 
       package-name="com.example"> 
    <java-types> 
     <java-type name="com.example.JAXBTest2$Zoo"> 
      <java-attributes> 
       <xml-element java-attribute="animals"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
    </xml-bindings> 

क्या इसका कोई बेहतर समाधान है जो बाहरी बाध्यकारी फ़ाइल का उपयोग नहीं करता है?

उत्तर

2

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

तरीका है कि Moxy कुंजी के रूप में प्रकार का उपयोग करता सूची में तत्वों के बीच क्रम की रक्षा नहीं करता है के एक सदस्य हूँ। क्या यह एक बग या फीचर है?

हमने कुंजी को बार-बार होने से रोकने के उद्देश्य से किया।

एक ही रास्ता है कि मैं इस को हल करने के साथ आए हैं एक बाहरी OXM बाध्यकारी Zoo.animals पर एनोटेशन ओवरराइड करने के लिए फ़ाइल बनाने के लिए है। नीचे बाध्यकारी JAXBContextProperties.OXM_METADATA_SOURCE की संपत्ति का उपयोग करके पंजीकृत है।

इस प्रकार मैं आपके उपयोग के मामले को हल करने की सलाह दूंगा।

+0

ब्लेज़, आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद। क्या आप वास्तविक वस्तु में कृत्रिम प्रकार की संपत्ति के बजाय जेसन कुंजी में प्रकार की जानकारी संग्रहीत करने का कारण जानते हैं? – user3099799

संबंधित मुद्दे