Java Unmarshal liste des objets avec une classe wrapper avec JAXB
Partir d'une requête XQuery effectuées par BaseX serveur-je obtenir un résultat comme ça:
<ProtocolloList>
<protocollo>
<numero>1</numero>
<data>2014-06-23</data>
<oggetto/>
<destinatario/>
<operatore/>
</protocollo>
...
</ProtocolloList>
Et j'ai besoin de convertir ce résultat dans une Liste de Protocollo objets avec JAXB pour que je puisse les montrer avec JList. Ainsi, à la suite de l'un des débats ici j'ai déclaré les classes suivantes:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "protocollo")
public class Protocollo {
private int numero;
private String data;
private String oggetto;
private String destinatario;
private String operatore;
public Protocollo(String d, String o, String des, String op) {
this.data = d;
this.oggetto = o;
this.destinatario = des;
this.operatore = op;
}
public Protocollo() {
}
@XmlElement
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
@XmlElement
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
@XmlElement
public String getOggetto() {
return oggetto;
}
public void setOggetto(String oggetto) {
this.oggetto = oggetto;
}
@XmlElement
public String getDestinatario() {
return destinatario;
}
public void setDestinatario(String destinatario) {
this.destinatario = destinatario;
}
@XmlElement
public String getOperatore() {
return operatore;
}
public void setOperatore(String operatore) {
this.operatore = operatore;
}
}
et
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "ProtocolloList")
public class ProtocolloList {
@XmlElementWrapper(name = "ProtocolloList")
@XmlElement(name = "protocollo")
private ArrayList<Protocollo> ProtocolloList;
public ArrayList<Protocollo> getProtocolloList() {
return ProtocolloList;
}
public void setProtocolloList(ArrayList<Protocollo> protocolloList) {
ProtocolloList = protocolloList;
}
}
et finalement j'ai exécuter la converion comme ça:
JAXBContext jaxbContext = JAXBContext.newInstance(Protocollo.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(this.resultXML);
protocolli = (ProtocolloList) unmarshaller.unmarshal(reader);
Et j'obtiens toujours cette exception:
unexpected element (uri:"", local:"ProtocolloList"). Expected elements are <{}protocollo>
Je suppose que je suis en train de faire quelques erreurs avec les annotations.
Pouvez-vous m'aider?
Ce qui sur Terre est-ce que avez à faire avec Swing?
OriginalL'auteur SagittariusA | 2014-07-24
Vous devez vous connecter pour publier un commentaire.
Pour votre cas d'utilisation, vous n'avez pas besoin de la
@XmlElementWrapper
annotation. C'est parce que leProtocolList
élément correspond à votre@XmlRootElement
annotation. Ensuite, vous devez le@XmlElement
annotation sur la propriété pour prendre chacun des éléments de la liste.Remarque:
Par défaut, vous devez annoter la propriété. Si vous souhaitez annoter les champs que vous devriez mettre
@XmlAccessorType(XmlAccessType.FIELD)
sur votre classe.Mise à JOUR
Vous devez vous assurer que votre
JAXBContext
est conscient de la classe racine. Vous pouvez modifier votreJAXBContext
code de création est la suivante:Oui, vous devez créer le
JAXBContext
sur leProtocolloList
classe.Merci, c'était vraiment l'erreur. Nice de la vôtre! 🙂
OriginalL'auteur bdoughan