2014-04-14 5 views
5

साथ वैकल्पिक का उपयोग करते हुए मैं सेटअप एक JAXB-एनोटेट जावा वर्ग चाहते निम्न स्वरूप में कुछ एक्सएमएल उत्पन्न करने के लिए होगा:अमरूद के @XmlAttribute

<page refId="0001"> 
    <title>The title of my page</title> 
</page> 

"refId" क्षेत्र वैकल्पिक है, तो मैं करना चाहते हैं मेमोरी में स्ट्रिंग को संदर्भित करने के लिए अमरूद के वैकल्पिक निर्माण का उपयोग करें। मैं Using generic @XmlJavaTypeAdapter to unmarshal wrapped in Guava's Optional देखता हूं, जो एक संपूर्ण उदाहरण देता है यदि आप तत्व का उपयोग कर रहे हैं (भले ही वह मूल प्रश्न न हो), लेकिन आप XML विशेषता के लिए एनोटेशन कैसे सेट अप करेंगे?

@XmlRootElement(name="page") 
public final class Page { 
    @XmlAttribute 
    @XmlJavaTypeAdapter(OptionalAdapter.class) 
    private Optional<String> refId; 

    @XmlElement 
    private String title; 

    ... getters/setters, default constructor, etc. 
} 

और OptionalAdapter एक सरल XmlAdapter है:

public class OptionalAdapter<T> extends XmlAdapter<T, Optional<T>> { 

    @Override 
    public Optional<T> unmarshal(T v) throws Exception { 
     return Optional.fromNullable(v); 
    } 

    @Override 
    public T marshal(Optional<T> v) throws Exception { 
     if (v == null || !v.isPresent()) { 
      return null; 
     } else { 
      return v.get(); 
     } 
    } 
} 

जब मैं ऊपर कोड के खिलाफ एक इकाई परीक्षण को लोड करने की कोशिश, यह तुरंत दौरान विफल रहता है

यहाँ मैं अब तक राशि है प्रारंभिकरण, लेकिन अगर मैं एनोटेशन को @XmlElement में बदलता हूं, तो परीक्षण चलाएगा और पास होगा, लेकिन स्पष्ट रूप से एक विशेषता के बजाय एक बच्चे तत्व के रूप में refId सेट करता है।

अग्रिम धन्यवाद!

उत्तर

4

Xml-विशेषता केवल साधारण प्रकार (जैसे String, Integer आदि) हो सकता है, तो आप OptionalAdapter<T> का उपयोग cann't।
यदि आपके फ़ील्ड में String टाइप है तो एडाप्टर के पास OptionalAdapter<String> होना चाहिए।
आप अगले तरह से कर सकते हैं:
- अतिरिक्त कक्षा बनाते हैं, और उपयोग के रूप में XmlAdapter

public final class StringOptionalAdapter extends OptionalAdapter<String> 
    { 
    } 

है Page.java

@XmlAttribute 
    @XmlJavaTypeAdapter(StringOptionalAdapter.class) 
    private Optional<String> refId; 
संबंधित मुद्दे