2012-03-29 15 views
6

के साथ जेएक्सबी मार्शलिंग सामान्य जेनेरिक सूची इसलिए मैं वस्तुओं की एक सामान्य सूची मार्शल करने की कोशिश कर रहा हूं, लेकिन मैं चाहता हूं कि प्रत्येक सूची में एक विशिष्ट XmlRootElement (name ..) हो। जिस तरह से मैं इसे कर रहा हूं, मुझे पता है कि प्रत्येक प्रकार के ऑब्जेक्ट के लिए एक विशिष्ट रैपर क्लास लिखने और XmlRootElement की घोषणा किए बिना यह वास्तव में संभव नहीं है। लेकिन शायद एक और तरीका है ...?परिवर्तनीय रूट तत्व नाम

abstract public class Entity { 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="user") 
public class User extends Entity { 

    private String username; 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

@XmlRootElement 
public class EntityList<T extends Entity> { 

    @XmlAnyElement(lax=true) 
    private List<T> list = new ArrayList<T>(); 

    public void add(T entity) { 
     list.add(entity); 
    } 

    public List<T> getList() { 
     return list; 
    } 

} 


public class Test { 

    public static void main(String[] args) throws JAXBException { 

     User user1 = new User(); 
     user1.setUsername("user1"); 

     User user2 = new User(); 
     user2.setUsername("user2"); 

     EntityList<User> list = new EntityList<User>(); 
     list.add(user1); 
     list.add(user2); 

     JAXBContext jc = JAXBContext.newInstance(EntityList.class, User.class); 
     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     m.marshal(list, System.out); 
    } 

} 

जैसी उम्मीद थी, इस का उत्पादन:

<entityList> 
    <user> 
     <username>user1</username> 
    </user> 
    <user> 
     <username>user2</username> 
    </user> 
</entityList> 

क्या मैं चाहता हूँ इकाई के प्रकार मैं बनाने पर निर्भर करता है कि टैग नाम संशोधित करने के लिए, सक्षम होने के लिए है

निम्नलिखित वर्गों पर विचार करें साथ EntityList।

मुझे पता है कि हम संकलन बनाम रन टाइम यहाँ बात कर रहे हैं, लेकिन शायद बच्चे से मूल तत्व रैपर बदलने के लिए कुछ प्रकार का हैकी तरीका है?

उत्तर

3

रनटाइम पर रूट तत्व नाम प्रदान करने के लिए आप JAXBElement में EntityList के उदाहरण को लपेट सकते हैं।

उदाहरण

+0

मुझे उस दिशा में इशारा करते हुए के लिए धन्यवाद ... यह एक सरल उदाहरण है के रूप में मैं JAXB मार्शलिंग के लिए वसंत के MarshallingView उपयोग कर रहा हूँ। लेकिन यह जानकर कि मैं रनटाइम पर एक रैपर के रूप में JAXBElement का उपयोग कर सकता हूं, मैं वसंत के लिए अपना खुद का मार्शलर कार्यान्वयन लिख सकता हूं और रनटाइम पर किसी प्रकार की कस्टम एनोटेशन का आत्मनिरीक्षण कर सकता हूं। धन्यवाद! – user1301841