2015-11-20 4 views
9

क्या कोई तरीका है कि हम बिना किसी क्लास के @XmlRootElement एनोटेशन के बिना un-marshall कर सकते हैं? या क्या हम एनोटेशन में प्रवेश करने के लिए बाध्य हैं?XAXRootElement एनोटेशन के बिना JAXB unmarshalling?

उदाहरण के लिए

:

public class Customer { 

    private String name; 
    private int age; 
    private int id; 

    public String getName() { 
     return name; 
    } 

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

    public int getAge() { 
     return age; 
    } 

    @XmlElement 
    public void setAge(int age) { 
     this.age = age; 
    } 

    public int getId() { 
     return id; 
    } 

    @XmlAttribute 
    public void setId(int id) { 
     this.id = id; 
    } 

} 

और ठीक तरह से एनोटेट वर्ग के लिए unmarshalling कोड रहने दो:

try { 

     File file = new File("C:\\file.xml"); 
     JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); 

     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     Customer customer = (Customer) jaxbUnmarshaller.unmarshal(file); 
     System.out.println(customer); 

     } catch (JAXBException e) { 
     e.printStackTrace(); 
     } 

विवरण छोड़कर।

उत्तर

18

के बाद कोड withot @XmlRootElement

public static void main(String[] args) { 

     try { 

      StringWriter stringWriter = new StringWriter(); 

      Customer c = new Customer(); 
      c.setAge(1); 
      c.setName("name"); 

      JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); 

      Marshaller marshaller = jaxbContext.createMarshaller(); 
      marshaller.marshal(new JAXBElement<Customer>(new QName("", "Customer"), Customer.class, null, c), stringWriter); 

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      InputStream is = new ByteArrayInputStream(stringWriter.toString().getBytes()); 
      JAXBElement<Customer> customer = (JAXBElement<Customer>) jaxbUnmarshaller.unmarshal(new StreamSource(is),Customer.class); 

      c = customer.getValue(); 

      } catch (JAXBException e) { 
      e.printStackTrace(); 
      } 

} 

कोड से ऊपर काम करता है केवल यदि आप ग्राहक वर्ग पर @XmlAccessorType(XmlAccessType.PROPERTY) जोड़ने, या निजी सभी विशेषताओं बनाने unmarshall मार्शल करने के लिए प्रयोग किया जाता है।

+0

, अन्यथा साथ या' बिना XmlRootElement', JAXB नहीं – Xstian

+1

काम करता है कि आप ऊपर वर्णित रास्ते किसी अन्य एनोटेशन की जरूरत नहीं होगी में, 'छोड़कर @ XmlAttribute' और '@ XmlElement' लेकिन वे आउटपुट – Xstian

+0

का वर्णन करते हैं, क्या यह अनमर्शलिंग से पहले मार्शल करना आवश्यक है? –

1

यदि आप मौजूदा बीन में XmlRootElement नहीं जोड़ सकते हैं तो आप धारक वर्ग भी बना सकते हैं और इसे एक्सएमएलआरयूटीमेंट के रूप में एनोटेशन के साथ चिह्नित कर सकते हैं। नीचे दिए गए उदाहरण: -

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class CustomerHolder 
{ 
    private Customer cusotmer; 

    public Customer getCusotmer() { 
     return cusotmer; 
} 

    public void setCusotmer(Customer cusotmer) { 
     this.cusotmer = cusotmer; 
    } 
} 
`सभी विशेषताओं private` बनाने के लिए विकल्प की कोशिश में