Ho trovato alcuni esempi di JAXB2 @XmlRegistry
su Internet ma non ci sono buoni tutorial approfonditi che parlano del concetto di usare @XmlRegistry
con @XmlElementDecl
, mi chiedo se è un concetto poco esplorato in generale.@XmlRegistry - come funziona?
Comunque qui è la mia domanda, prima alcune classi di esempio che sto usando per unmarshall un XML utilizzando JAXB:
La classe principale che sto cercando di unmarshalling utilizzando JAXB - Employee.java
package com.test.jaxb;
import java.util.List;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import com.test.jaxb.dto.Address;
@XmlRootElement
public class Employee {
private int id;
private String name;
private String email;
private List<Address> addresses;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
@SuppressWarnings("unused")
@XmlRegistry
public static class XMLObjectFactory {
@XmlElementDecl(scope = Employee.class, name= "id")
JAXBElement<String> createEmployeeId(String value) {
return new JAXBElement<String>(new QName("id"), String.class, "100");
}
@XmlElementDecl(scope = Employee.class, name= "name")
JAXBElement<String> createName(String value) {
return new JAXBElement<String>(new QName("name"), String.class, "Fake Name");
}
@XmlElementDecl(scope = Employee.class, name= "email")
JAXBElement<String> createEmail(String value) {
return new JAXBElement<String>(new QName("email"), String.class, value);
}
@XmlElementDecl(scope = Employee.class, name= "addresses")
JAXBElement<List> createAddresses(List value) {
return new JAXBElement<List>(new QName("addresses"), List.class, value);
}
}
}
la classe bambino - Address.java
package com.test.jaxb.dto;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import com.test.jaxb.Employee;
@XmlRootElement
public class Address {
private String addressLine1;
private String addressLine2;
private String addressLine3;
public String getAddressLine1() {
return addressLine1;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public void setAddressLine2(String addressLine2) {
this.addressLine2 = addressLine2;
}
public String getAddressLine3() {
return addressLine3;
}
public void setAddressLine3(String addressLine3) {
this.addressLine3 = addressLine3;
}
@SuppressWarnings("unused")
@XmlRegistry
private static class XMLObjectFactory {
@XmlElementDecl(scope = Employee.class, name= "addressLine1")
JAXBElement<String> createAddressLine1(String value) {
return new JAXBElement<String>(new QName("addressLine1"), String.class, value);
}
@XmlElementDecl(scope = Employee.class, name= "addressLine2")
JAXBElement<String> createAddressLine2(String value) {
return new JAXBElement<String>(new QName("addressLine2"), String.class, value);
}
@XmlElementDecl(scope = Employee.class, name= "addressLine3")
JAXBElement<String> createAddressLine3(String value) {
return new JAXBElement<String>(new QName("addressLine3"), String.class, value);
}
}
}
l'XML da deserializzati - employee.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
<id>1</id>
<name>Vaishali</name>
<email>[email protected]</email>
<addresses>
<address>
<addressLine1>300</addressLine1>
<addressLine2>Mumbai</addressLine2>
<addressLine3>India</addressLine3>
</address>
<address>
<addressLine1>301</addressLine1>
<addressLine2>Pune</addressLine2>
<addressLine3>India</addressLine3>
</address>
</addresses>
</employee>
Codice unmarshalling:
package com.test.jaxb;
import java.io.FileReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class ObjectFactoryTest {
public static void main(String[] args) throws Exception {
FileReader reader = new FileReader("resources/employee.xml");
JAXBContext context = JAXBContext.newInstance(Employee.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Object obj = unmarshaller.unmarshal(reader);
System.out.println(obj);
}
}
Quando ho Unmarshal XML dipendente utilizza sopra il codice, l'elenco di indirizzi non ottiene popolata. L'oggetto dipendente risultante ha solo una lista vuota di indirizzi. C'è qualcosa di sbagliato nelle mie mappature?
Per scoprire cosa sta succedendo e vedere se gli oggetti dipendenti vengono effettivamente creati utilizzando l'Object Factory (con l'annotazione @XMLRegistry), ho modificato il valore di id e name nei metodi factory, tuttavia ciò non ha avuto alcun effetto nell'output, che mi dice che JAXB non sta effettivamente utilizzando ObjectFactory, perché?
Sto uscendo tutto sbagliato? Qualsiasi aiuto sarebbe apprezzato.
Ho trovato diversi esempi di '@XmlRegistry' utilizzato allo stesso modo in cui lo sto usando, guarda [qui] (http://www.codezealot.org/archives/5). Capisco che posso usare '@XmlElementWrapper' per fare questo. La mia domanda riguardava la comprensione di cosa sia "@XmlRegistry" e cosa potessi fare con esso. AFAIK I dovrebbe essere in grado di usare objectfactory (annotato con '@XmlRegistry') per unmarshal unmarshal e convertirlo in un oggetto. In caso contrario, a cosa serve? Devo registrarlo da qualche parte per poterlo utilizzare (come ho dimostrato nel mio esempio, la mia fabbrica di oggetti non è mai realmente utilizzata da JAXB)? – gresdiplitude
La mia comprensione potrebbe essere completamente errata qui, ma ho pensato che ci deve essere un modo per applicare qualcosa di simile a "@XmlElementWrapper" a "@XmlRegistry", in quanto è un modo alternativo di unmarshalling XML. Nessun punto per indovinare Sono totalmente confuso come funziona @XmlRegistry !!! – gresdiplitude
@Vaishali - Ho aggiornato la mia risposta per includere un esempio di '@ XmlRegistry' e' @ XmlElementDecl' –