2015-11-20 7 views
9

@XmlRootElement ek açıklaması olmadan bir sınıfa ayrılmanın herhangi bir yolu var mı? Yoksa ek açıklama girmek zorunda mıyız? örneğinJAXB 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; 
    } 

} 

ve benzeri düzgün açıklamalı sınıf için unmarshalling kod olalım:

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(); 
     } 

ayrıntıları dışarıda bırakarak.

cevap

18

ardından kod kod Üstü @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(); 
      } 

} 

Müşteri sınıfına @XmlAccessorType(XmlAccessType.PROPERTY) ekleyerek veya tüm özellikleri özel yapmak durumunda çalışır iâ Marshall'a için kullanılır ve unmarshall edilir.

+0

, aksi birlikte veya XmlRootElement'' olmadan JAXB değil 'dışında herhangi başka ek açıklamaları gerekmez yukarıda anlatılan şekilde – Xstian

+1

işleri yok @ XmlAttribute' ve '@ XmlElement' ancak çıktıyı açıklarlar – Xstian

+0

Ayırmadan önce marshall gerekli mi? –

1

XmlRootElement öğesini varolan fasülyeye ekleyemezseniz, bir tutucu sınıfı da oluşturabilir ve bunu ek açıklama ile birlikte XmlRootElement olarak işaretleyebilirsiniz. Aşağıdaki Örnek: -

`private` tüm özelliklerini yapmak için alternatif denemede
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; 
    } 
}