@XmlRegistry - wie funktioniert das?
Ich habe einige Beispiele von JAXB2 @XmlRegistry
über das internet aber keine gute in-depth tutorials, die Diskussion über das Konzept der Verwendung von @XmlRegistry
mit @XmlElementDecl
, Frage mich, ob es sich um ein Konzept, dass sich nicht viel erforscht im Allgemeinen.
Anyways, hier ist meine Frage, zuerst einige Beispiel-Klassen, die ich benutze, um unmarshall ein xml mit Hilfe von JAXB:
Main-Klasse, die ich bin versucht zu unmarshal mit 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);
}
}
}
Die Kind-Klasse - 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);
}
}
}
Den xml-unmarshallt - 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>
Unmarshalling-Code :
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);
}
}
Wenn ich unmarshal der Mitarbeiter unter Verwendung der obigen xml-code, die Adresse der Liste nicht aufgefüllt. Die daraus resultierende Mitarbeiter-Objekt hat nur eine leere Liste von Adressen. Gibt es etwas falsch mit meinen Zuordnungen?
Finden Sie heraus, was Los ist und sehen, ob die Mitarbeiter-Objekte sind tatsächlich erstellt wird, mithilfe der Objekt-Factory (mit der @XMLRegistry annotation), änderte ich den Wert der id und name in der Fabrik-Methoden, aber das hatte keine Auswirkungen auf die Ausgabe, die mir sagt, JAXB ist nicht wirklich mit der ObjectFactory, warum?
Werde ich aboout diese alle falsch? Jede Hilfe würde geschätzt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
@XmlRegistry
wird verwendet, um eine Klasse, die@XmlElementDecl
Anmerkungen. Ihre JAXB Implementierung dieser Klasse, die Sie benötigen, um sicherzustellen, dass es ist aufgenommen in der Liste der Klassen, die Sie zum bootstrap derJAXBContext
. Es ist nicht genug für Sie zu sein, eine statische innere Klasse eines domain-model-Klassen:Wenn der Wert des Feldes/Eigenschaft wird ein
JAXBElement
dann müssen Sie nutzen@XmlElementDecl
. EinJAXBElement
erfasst Informationen, die hilfreich sein können:JAXBElement
können verwendet werden zum repräsentieren ein element mitxsi:nil="true"
.XmlObjectFactory
@XmlElementDecl
können Sie auch einen Bereich angeben. Ich habe modifiziert das Modell von dir post ein bisschen. Ich habe eingeführt eineXmlObjectFactory
Klasse, die zwei@XmlElementDecl
. Beide geben Sie einen Namenaddress
. Ich nutzte diescope
Eigenschaft so ein, dass für die Eigenschaften innerhalb derEmployee
Klasse der@XmlElementDecl
entsprechend derAddress
Klasse mit verwendet werden.Mitarbeiter
Den
@XmlElementRef
Anmerkung wird die Ursache der Wert der Eigenschaft abgeglichen werden, die auf seinem root-element name. Mögliche übereinstimmungen werden Klassen zugeordnet, die mit@XmlRootElement
oder@XmlElementDecl
.ObjectFactoryTest
Den
Address
Klasse undinput.xml
aus meiner ursprünglichen Antwort kann verwendet werden, um dieses Beispiel auszuführen.URSPRÜNGLICHE ANTWORT
Ich bin mir nicht sicher, wie Sie Sie verwenden möchten
@XmlRegistry
, also konzentriere ich mich auf den folgenden Teil Ihres Beitrags:Ihre Liste der
Address
Objekte verpackt in einem Gruppierungselement (addresses
), so müssen Sie die@XmlElementWrapper
Anmerkung zum anzeigen dieser use-case. Unten ist ein komplettes Beispiel:Mitarbeiter
Adresse
ObjectFactoryTest
Eingang.xml - /Ausgabe
@XmlRegistry
und@XmlElementDecl
@XmlRegistry
gut, vielen Dank!Haben Sie, um eine Liste Objekt-Adresse. In diesem Objekt, haben Sie das Objekt hinzufügen, die die Daten enthält, wie addressline1. addressline2 und so weiter.