UnMarshalling di JAXB senza annotazione XmlRootElement?

C’è un modo in cui possiamo annullare un marshall per una class senza l’annotazione @XmlRootElement? O siamo obbligati a inserire l’annotazione?

per esempio:

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

e lascia che il codice di riarrangiamento per le classi annotate correttamente sia come:

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

tralasciando i dettagli.

Il seguente codice viene utilizzato per marshall e unmarshall senza @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( new QName("", "Customer"), Customer.class, null, c), stringWriter); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); InputStream is = new ByteArrayInputStream(stringWriter.toString().getBytes()); JAXBElement customer = (JAXBElement) jaxbUnmarshaller.unmarshal(new StreamSource(is),Customer.class); c = customer.getValue(); } catch (JAXBException e) { e.printStackTrace(); } } 

Il codice sopra funziona solo se si aggiunge @XmlAccessorType(XmlAccessType.PROPERTY) sulla class Customer o se si rendono privati ​​tutti gli attributi.

Se non è ansible aggiungere XmlRootElement al bean esistente, è anche ansible creare una class titolare e contrassegnarla con annotazione come XmlRootElement. Esempio di seguito: –

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