@XmlRegistry - comment ça fonctionne?
J'ai trouvé quelques exemples de JAXB2 @XmlRegistry
sur internet, mais pas de bons tutoriels en profondeur, que le discours sur le concept de l'utilisation de @XmlRegistry
avec @XmlElementDecl
, me demande si c'est un concept qui n'est pas beaucoup exploré en général.
De toute façon, voici ma question, tout d'abord, quelques exemples de cours que je suis à l'aide de unmarshall un xml à l'aide de JAXB:
La classe principale, je suis en train de unmarshal à l'aide de 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);
}
}
}
L'enfant de la classe 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);
}
}
}
Le code xml à unmarshalled - 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);
}
}
Quand je unmarshal l'employé xml à l'aide de code ci-dessus, la liste d'adresses ne sont pas remplis. Le résultant objet employé ne dispose que d'un vide de la liste d'adresses. Il n'y a rien de mal avec mon mappages?
Pour savoir ce qui se passe et voir si l'employé objets sont en fait créés à l'aide de l'Objet de l'Usine (@XMLRegistry annotation), j'ai changé la valeur de l'id et le nom de l'usine de méthodes, cependant, qui n'a eu aucun effet sur la sortie, qui me dit JAXB n'est pas réellement à l'aide de la ObjectFactory, pourquoi?
Vais-je aboout ce tort et à travers? Toute aide serait appréciée.
OriginalL'auteur gresdiplitude | 2012-06-18
Vous devez vous connecter pour publier un commentaire.
@XmlRegistry
est utilisé pour marquer une classe qui a@XmlElementDecl
annotations. Votre JAXB processus de mise en œuvre de cette classe, vous devez vous assurer qu'il est inclus dans la liste des classes utilisées pour l'amorçage de l'JAXBContext
. Il n'est pas suffisant pour qu'il soit statique intérieure d'une de vos classes de modèle de domaine:Si la valeur du champ ou de la propriété va être un
JAXBElement
alors vous avez besoin pour tirer parti de@XmlElementDecl
. UnJAXBElement
capture des informations qui peuvent être utiles:JAXBElement
peut être utilisé pour représenter un élément avecxsi:nil="true"
.XmlObjectFactory
@XmlElementDecl
vous permet également de spécifier un champ d'application. J'ai modifié le modèle de vous post un peu. J'ai présenté unXmlObjectFactory
classe qui a deux@XmlElementDecl
. Les deux spécifier un nom deaddress
. J'ai mis à profit lescope
de la propriété ainsi que pour les propriétés à l'intérieur de laEmployee
classe le@XmlElementDecl
correspondant à laAddress
classe à être utilisé.Employé
La
@XmlElementRef
annotation sera la cause de la valeur de la propriété à être appariés sur son nom de l'élément racine. Correspondances possibles comprendra des classes mappées avec@XmlRootElement
ou@XmlElementDecl
.ObjectFactoryTest
La
Address
classe etinput.xml
de ma réponse originale à cette question peut être utilisé pour exécuter cet exemple.RÉPONSE ORIGINALE À CETTE QUESTION
Je ne suis pas sûr de savoir comment vous tentez d'utiliser
@XmlRegistry
, donc je vais me concentrer sur la suite de votre post:Votre liste de
Address
objets est enveloppé dans un élément de regroupement (addresses
), si vous avez besoin d'utiliser le@XmlElementWrapper
annotation à la carte ce cas d'utilisation. Ci-dessous est un exemple complet:Employé
Adresse
ObjectFactoryTest
d'entrée.xml/Sortie
Ma compréhension peut être complètement erronée ici, mais j'ai pensé qu'il doit y avoir un moyen de l'application de quelque chose de similaire à '@XmlElementWrapper' à la '@XmlRegistry', comme une autre façon de unmarshalling XML. Pas de points pour le deviner je suis totalement confus comment @XmlRegistry fonctionne!!!
J'ai mis à jour ma réponse à inclure un exemple de levier
@XmlRegistry
et@XmlElementDecl
+1 pour l'explication des concepts, votre blog a, dans le passé, m'a donné des réponses à beaucoup de mes jaxb questions, cependant, je ne trouve pas de tutoriels sur ce sujet, peut-être que vous pourriez faire un sur elle. Besoin de l'essayer avant que j'accepte la réponse.
œuvres! votre réponse explique comment et quand utiliser
@XmlRegistry
bien, merci!OriginalL'auteur bdoughan
Vous avez à prendre un objet de la Liste d'Adresse. Dans cet objet, vous devrez ajouter l'objet qui contient les données comme addressline1. addressline2 et ainsi de suite.
OriginalL'auteur Alpesh Prajapati