java jaxb analyse simple est exigeant @XmlAccessorType(XmlAccessType.CHAMP) annotation
Je suis en train d'essayer de parser un xml à des objets java, j'ai lu et mis en œuvre le tutoriel suivant:
http://www.vogella.com/articles/JAXB/article.html (fonctionne parfaitement)
Mais quand je créer mon propre clases (similaires à ceux dans le tutoriel)
J'obtiens: Exception in thread "main" com.soleil.xml.interne.bind.v2.moment de l'exécution.IllegalAnnotationsException: 1 comtes de IllegalAnnotationExceptions
Classe possède deux propriétés du même nom "clientélistes"
À moins que j'utilise @XmlAccessorType(XmlAccessType.CHAMP) de la classe Clientes, mais dans le tutoriel n'est pas utilisé.
Des idées ?
(Il fonctionne très bien avec le @XmlAccessorType(XmlAccessType.CHAMP) annotation, mais je veux savoir pourquoi est-il nécessaire avec mes classes, alors que ce n'est pas pour les classes dans le tutoriel)
Je vous remercie à l'avance pour toutes les informations.
Classe Cliente
package mx.com.findep.crediseguros.dto.servicios.finsol;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "cliente")
public class Cliente {
private String numeroPersona;
@XmlElement(name = "numeroPersona")
public String getNumeroPersona() {
return numeroPersona;
}
public void setNumeroPersona(String numeroPersona) {
this.numeroPersona = numeroPersona;
}
}
Classe Clientes
package mx.com.findep.crediseguros.dto.servicios.finsol;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "clientes")
//@XmlAccessorType(XmlAccessType.FIELD) //without this line it fails
public class Clientes {
//XmLElementWrapper generates a wrapper element around XML representation
@XmlElementWrapper(name = "clienteList")
//XmlElement sets the name of the entities
@XmlElement(name = "cliente")
private ArrayList<Cliente> clienteList;
public void setClienteList(ArrayList<Cliente> clienteList) {
this.clienteList = clienteList;
}
public ArrayList<Cliente> getClienteList() {
return clienteList;
}
}
De Tester Mon Gares De
package mx.com.findep.crediseguros.dto.servicios.finsol;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class TestClientesXml {
private static final String SOME_XML = "C:/bea/user_projects/domains/DominioDesarrollo/esquemas/calculoCostoSeguroPeticion.xml";
public static void main(String[] args) throws JAXBException, IOException {
ArrayList<Cliente> clienteList = new ArrayList<Cliente>();
Cliente cliente1 = new Cliente();
cliente1.setNumeroPersona("1");
clienteList.add(cliente1);
Cliente cliente2 = new Cliente();
cliente2.setNumeroPersona("2");
clienteList.add(cliente2);
Clientes clientes = new Clientes();
clientes.setClienteList(clienteList);
JAXBContext context = JAXBContext.newInstance(Clientes.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(clientes, System.out);
m.marshal(clientes, new File(SOME_XML));
System.out.println();
System.out.println("Output from our XML File: ");
Unmarshaller um = context.createUnmarshaller();
Clientes clientes2 = (Clientes) um.unmarshal(new FileReader(SOME_XML));
ArrayList<Cliente> list = clientes2.getClienteList();
for (Cliente cliente : list) {
System.out.println("Cliente: " + cliente.getNumeroPersona());
}
}
}
OriginalL'auteur Jonathan Caballero | 2013-11-06
Vous devez vous connecter pour publier un commentaire.
Par défaut JAXB traite des champs publics et les propriétés de la cartographie. Si vous annoter un champ il considère alors le domaine et la propriété de la cartographie à l'origine du conflit. Sans
@XmlAccessorType(XmlAccessType.FIELD)
vous devez annoter les obtenir ou de définir la méthode.Pour Plus D'Informations
C'est parce que dans l'exemple de la liste des biens a un getter, mais pas de setter. Cela signifie que, par défaut, JAXB de ne pas traiter de la cartographie.
Qui a été me rend fou, je vous remercie beaucoup, seulement c'est ne a un setter et mais pas de getter. Merci encore. 🙂
Est-il un moyen de le faire sans les annotations?
OriginalL'auteur bdoughan
Donc permet de dire que nous avons:
si nous exécuter le code, nous aurons
Exception in thread "main"
Mais si l'on ajoute l'annotation: XmlAccessorType
l'erreur disparaît.
Quand ont de la classe qui veulent marshall et 10 champs, je préfère annoter seuls les champs, pas une seule fois le setter puis de la lecture. Donc, utiliser @XmlAccessorType et annoter uniquement les champs.
OriginalL'auteur Xelian