2011-02-15 18 views
8

मेरे पास एक पशु वर्ग और AnimalExtension नामक पशु का विस्तार है।JAXB @XmlElements, विभिन्न प्रकार लेकिन समान नाम?

public class Animal 

public class AnimalExtension extends Animal 

दो वर्गों के बीच एकमात्र अंतर यह है कि AnimalExtension में AnimalId नामक एक और उदाहरण चर है। पशु में यह आवृत्ति चर नहीं है।

मेरे पास अपना स्वयं का डेटा प्रकार भी है जो मैं XML के लिए मार्शल और अनैमरल करना चाहता हूं। इस डेटा प्रकार को AnimalList कहा जाता है। AnimalList के अंदर, एक उदाहरण चर के रूप में जानवरों की एक सूची है।

@XmlType(name = "AnimalList") 
public class AnimalList{ 
    private List<Animal> animalList; 
    .... 

पशु सूची में पशु और पशु दोनों एक्सटेंशन हो सकते हैं। हालांकि, एक्सएमएल पर मैं नहीं चाहता कि तत्व को AnimalExtension के रूप में नामित किया जाए; मैं उन सभी को पशु का तत्व नाम रखना चाहता हूं। मैं केवल अतिरिक्त विशेषता दिखाना चाहता हूं जब जेएक्सबी जानता है कि पशु वास्तव में AnimalExtension का एक उदाहरण है। तो अगर मेरे पास है की एक सूची लग रहा है

तरह
List<Animal> animalList = new LinkedList<Animal>(); 
AnimalExtension animalExtension = new AnimalExtension(); 
animalExtension.setAnimalId(1); 
amimalExtension.setName("Don"); 

Animal animal = new Animal(); 
animal.setName("Mike"); 
animalList.add(animalExtension); 
animalList.add(animal); 

मैं एक्सएमएल

<AnimalList> 
    <Animal name="Don" id="1" /> 
    <Animal name="Mike" /> 
</AnimalList> 

इस तरह देखने के लिए चाहते हैं मैं कोड को संकलित करता है लेकिन

@XmlElements(
    { 
      @XmlElement(name = "Animal", type = Animal.class), 
      @XmlElement(name = "Animal", type = AnimalExtension.class) 
     } 
    ) 
    public List<Animal> getEntries() { 
     return animalList; 
    } 

करने का प्रयास किया क्या है जब मैं अपना सर्वर चलाने की कोशिश करता हूं। यह मुझे यह अजीब त्रुटि देता है जो कि क्या हो रहा है (बीनक्रिएशन अपवाद) से इतना असंबंधित है। मैंने XmlElement का नाम प्रत्येक प्रकार के लिए अलग होने की कोशिश की और यह काम करता है, लेकिन यहां चुनौती नाम को समान बनाना है।

AnimalAdapter

के बाद से AnimalExtension पशु का एक सुपर सेट हम इसका इस्तेमाल/एक्सएमएल का उपभोग उत्पादन करने के लिए होगा:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'encryptionPayloadContentProvider' 
+5

एक एक्सएमएल कैसे JAXB जो वर्ग जावा ऑब्जेक्ट निर्माण के लिए उपयोग करने के लिए निर्धारित करने के लिए माना जाता है को देखते हुए? क्या यह 'आईडी' विशेषता का अस्तित्व है? क्या होगा यदि आईडी विशेषता के साथ 'AnimalEnhacement' नामक अन्य श्रेणी थी? –

+0

अच्छा बिंदु lol। उस बारे में सोचा नहीं था। – denniss

उत्तर

9

उपयोग के इस मामले आप निम्नलिखित XmlAdapters का लाभ उठाने सकता है नक़्शा बनाने के लिए। फिर हम जानवरों के मूल्य का लाभ उठाएंगे यह निर्धारित करने के लिए कि पशु या पशु एक्सटेंशन का उदाहरण AnimalList को वापस कर दिया जाएगा या नहीं।

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

public class AnimalAdapter extends XmlAdapter<AnimalExtension, Animal> { 

    @Override 
    public Animal unmarshal(AnimalExtension animalExtension) throws Exception { 
     if(0 != animalExtension.getAnimalId()) { 
      return animalExtension; 
     } 
     Animal animal = new Animal(); 
     animal.setName(animalExtension.getName()); 
     return animal; 
    } 

    @Override 
    public AnimalExtension marshal(Animal animal) throws Exception { 
     if(animal.getClass() == AnimalExtension.class) { 
      return (AnimalExtension) animal; 
     } 
     AnimalExtension animalExtension = new AnimalExtension(); 
     animalExtension.setName(animal.getName()); 
     return animalExtension; 
    } 

} 

IdAdapter

हम animalId को दबाने के लिए अगर इसके मान 0 है एक दूसरे XmlAdapter की आवश्यकता होगी:

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

public class IdAdapter extends XmlAdapter<String, Integer> { 

    @Override 
    public Integer unmarshal(String string) throws Exception { 
     return Integer.valueOf(string); 
    } 

    @Override 
    public String marshal(Integer integer) throws Exception { 
     if(integer == 0) { 
      return null; 
     } 
     return String.valueOf(integer); 
    } 

} 

आपका मॉडल वर्गों के रूप में इस पर टिप्पणी की जा जाएगा:

AnimalList

import java.util.ArrayList; 
import java.util.List; 

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

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

    private List<Animal> animalList = new ArrayList<Animal>(); 

    @XmlElement(name="Animal") 
    @XmlJavaTypeAdapter(AnimalAdapter.class) 
    public List<Animal> getEntries() { 
     return animalList; 
    } 

} 

पशु

import javax.xml.bind.annotation.XmlAttribute; 

public class Animal { 

    private String name; 

    @XmlAttribute 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

AnimalExtension

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

public class AnimalExtension extends Animal { 

    private int animalId; 

    @XmlAttribute(name="id") 
    @XmlJavaTypeAdapter(IdAdapter.class) 
    public int getAnimalId() { 
     return animalId; 
    } 

    public void setAnimalId(int animalId) { 
     this.animalId = animalId; 
    } 

} 

डेमो कोड

निम्नलिखित डेमो कोड इस समाधान प्रदर्शित करने के लिए इस्तेमाल किया जा सकता:

import java.io.File; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("input.xml"); 
     AnimalList animalList = (AnimalList) unmarshaller.unmarshal(xml); 

     for(Animal animal : animalList.getEntries()) { 
      System.out.println(animal.getClass()); 
     } 

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

} 

निम्नलिखित उत्पादन का उत्पादन किया जाएगा:

class AnimalExtension 
class Animal 
<?xml version="1.0" encoding="UTF-8"?> 
<AnimalList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Animal name="Don" id="1"/> 
    <Animal name="Mike"/> 
</AnimalList> 

संबंधित सूचना

आप निम्नलिखित जानकारी उपयोगी हो सकते हैं:

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