2010-02-22 10 views
5

मान लीजिए कि मुझे मिल गया है मेरे डोमेन वस्तुओं बाहर रखी तो एक्सएमएल इस तरह दिखता है:क्या JAXB में प्रतिपादन गहराई को कॉन्फ़िगर करने का कोई तरीका है?

<account id="1"> 
    <name>Dan</name> 
    <friends> 
    <friend id="2"> 
     <name>RJ</name> 
    </friend> 
    <friend id="3"> 
     <name>George</name> 
    </friend> 
    </friends> 
</account> 

मेरे डोमेन वस्तु:

@XmlRootElement 
public class Account { 
    @XmlAttribute 
    public Long id; 
    public String name; 

    @XmlElementWrapper(name = "friends") 
    @XmlElement(name = "friend") 
    public List<Account> friends; 
} 

वहाँ एक आसान तरीका JAXB केवल करने के लिए प्रस्तुत करने के लिए कॉन्फ़िगर करने के लिए है 2 की गहराई? मतलब, मैं इस तरह देखने के लिए मेरी एक्सएमएल चाहते हैं:

<account id="1"> 
    <name>Dan</name> 
    <friends> 
     <friend id="2" /> 
     <friend id="3" /> 
    </friends> 
</account> 
+1

नहीं JAXB के साथ, नहीं। आपको किसी अन्य एक्सएमएल-मैनिपुलेशन प्रक्रिया में जेएक्सबी के आउटपुट को पाइप करने में सक्षम होना चाहिए, हालांकि यह करता है। – skaffman

उत्तर

3

आप इस एक XmlJavaTypeAdapter उपयोग कर सकते हैं।

खाता परिवर्तन इस प्रकार है:

@XmlRootElement 
public class Account { 
    @XmlAttribute 
    public Long id; 
    public String name; 

    @XmlElementWrapper(name = "friends") 
    @XmlElement(name = "friend") 
    @XmlJavaTypeAdapter(value = AccountAdapter.class) 
    public List<Account> friends; 
} 

AccountAdapter.java:

public class AccountAdapter extends XmlAdapter<AccountRef, Account> 
{ 
    @Override 
    public AccountRef marshal(Account v) throws Exception 
    { 
     AccountRef ref = new AccountRef(); 
     ref.id = v.id; 
     return ref; 
    } 

    @Override 
    public Account unmarshal(AccountRef v) throws Exception 
    { 
     // Implement if you need to deserialize 
    } 
} 

AccountRef.java:

@XmlRootElement 
public class AccountRef 
{ 
    @XmlAttribute 
    public Long id; 
} 
+0

क्या आपने इसे देखा है? मुझे पूरा यकीन है कि यह काम नहीं करेगा, 'XmlJavaTypeAdapter' केवल स्केलर स्ट्रिंग मानों को संभाल सकता है, न कि संपूर्ण XML तत्वों, भले ही कक्षा हस्ताक्षर अन्यथा सुझाता है। – skaffman

+0

@skaffman - हाँ मैंने इसका परीक्षण किया है (हालांकि मैंने देखा है कि मैं AccountRef की परिभाषा को शामिल करना भूल गया - मैंने अपना जवाब अपडेट कर दिया है)। कुंजी यह है कि XMLJavaTypeAdapter आपको केवल उस श्रेणी को क्रमबद्ध करने की अनुमति नहीं देता है जिसे JAXB के बारे में पता नहीं है बल्कि यह भी बदलता है कि प्रति वर्ग आधार पर कक्षा को क्रमबद्ध कैसे किया जाता है। यहां मैं एक नई कक्षा बना रहा हूं जो केवल खाता के आईडी फ़ील्ड को क्रमबद्ध करता है। – mtpettyp

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

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