Je travaille avec LMS eBay (Large Services marchands) et rencontrais l'erreur:Comment ajouter un attribut d'espace de noms à un élément dans JAXB lors du marshaling?
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
Après beaucoup d'essais et d'erreurs que je traçais le problème vers le bas. Il se trouve que cela fonctionne:
<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<Version>583</Version>
<SiteID>0</SiteID>
</Header>
<AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
alors que ce (ce que j'ai envoyais) n'a pas:
<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<Version>583</Version>
<SiteID>0</SiteID>
</Header>
<AddFixedPriceItemRequest>
La différence est l'attribut xml namespace sur le AddFixedPriceItemRequest
. Tout mon XML est actuellement en cours de compilation via JAXB et je ne suis pas sûr de la meilleure façon d'ajouter un deuxième attribut xmlns à un élément différent dans mon fichier.
Voilà donc la question. Comment ajouter un attribut xmlns à un autre élément dans JAXB?
MISE À JOUR:
package ebay.apis.eblbasecomponents;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AddFixedPriceItemRequestType", propOrder = {
"item"
})
public class AddFixedPriceItemRequestType
extends AbstractRequestType
{
@XmlElement(name = "Item")
protected ItemType item;
public ItemType getItem() {
return item;
}
public void setItem(ItemType value) {
this.item = value;
}
}
Ajouté définition de classe demande.
MISE À JOUR 2: Sous la direction de la classe ci-dessus comme pour ainsi aucun effet:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "urn:ebay:apis:eBLBaseComponents",
name = "AddFixedPriceItemRequestType", propOrder = {
"item"
})
public class AddFixedPriceItemRequestType
MISE À JOUR 3: Voici un extrait de la classe BulkDataExchangeRequestsType. J'ai essayé de lancer un namespace="urn:ebay:apis:eBLBaseComponents"
dans le @XmlElement pour AddFixedPriceItemRequest mais il n'a rien fait.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BulkDataExchangeRequestsType", propOrder = {
"header",
"addFixedPriceItemRequest"
})
public class BulkDataExchangeRequestsType {
@XmlElement(name = "Header")
protected MerchantDataRequestHeaderType header;
@XmlElement(name = "AddFixedPriceItemRequest")
protected List<AddFixedPriceItemRequestType> addFixedPriceItemRequest;
MISE À JOUR 4: Voici le morceau hideux de code qui est mise à jour le xml après marshalling pour moi. Cela fonctionne actuellement même si je n'en suis pas particulièrement fier.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
marshaller.marshal(request, doc);
NodeList nodes = doc.getChildNodes();
nodes = nodes.item(0).getChildNodes();
for(int i = 0; i < nodes.getLength(); i++){
Node node = nodes.item(i);
if (!node.getNodeName().equals("Header")){
((Element)node).setAttribute("xmlns", "urn:ebay:apis:eBLBaseComponents");
}
}
Merci pour toute l'aide à tous.
Que voulez-vous dire par "généré via JAXB"? Pourriez-vous ajouter une définition de votre classe AddFixedPriceItemRequest? –
J'utilise le marshaling via JAXB pour générer le XML. Je ne vois pas de balise spécifique qui ajoute l'attribut xmlns à la classe BulkDataExchangeRequestsType. J'ai ajouté la définition de classe AddFixedPriceItemRequestType à la question. –
Pourquoi ne pas générer le schéma spécifié dans le WSDL? http://developer.ebay.com/webservices/bulk-data-exchange/latest/BulkDataExchangeService.wsdl –