JAXB génère défectueux classes
après la génération de certaines classes à partir d'un fichier xsd, les classes sont défectueux.
@xmlElementRef est utilisé avec required="false" et que l'attribut n'est pas autorisé.
Mon .xsd je suis en utilisant:
<xs:schema xmlns:ns="http://shop.pau.softm.com/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://shop.pau.softm.com/xsd">
<xs:element name="checkOrder">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="order" nillable="true" type="ns:Order"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Order">
<xs:sequence>
<xs:element minOccurs="0" name="addressNumber" type="xs:int"/>
<xs:element minOccurs="0" name="auftragsNummer" type="xs:int"/>
<xs:element minOccurs="0" name="companyNumber" nillable="true" type="xs:string"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="condition" nillable="true" type="ns:Condition"/>
<xs:element minOccurs="0" name="currency" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="customerId" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="customerReference" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="deliveryAddress" nillable="true" type="ns:Address"/>
<xs:element minOccurs="0" name="deliveryConditions" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="deliveryType" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="endCustomerId" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="endCustomerReference" nillable="true" type="xs:string"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="error" nillable="true" type="ns:Error"/>
<xs:element minOccurs="0" name="haltDescription" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="haltFlag" type="xs:boolean"/>
<xs:element minOccurs="0" name="keySalesArea" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="openingHours" nillable="true" type="xs:string"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="orderItem" nillable="true" type="ns:OrderItem"/>
<xs:element minOccurs="0" name="origin" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="tourNumber" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="warehouseMan" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="warehouseNumber" type="xs:int"/>
<xs:element minOccurs="0" name="wishedDeliveryDate" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Condition">
<xs:sequence>
<xs:element minOccurs="0" name="description" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Address">
<xs:sequence>
<xs:element minOccurs="0" name="city" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="country" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="createAddress" type="xs:boolean"/>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name2" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name3" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name4" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="street" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="zip" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Error">
<xs:sequence>
<xs:element minOccurs="0" name="code" type="xs:int"/>
<xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="origin" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="OrderItem">
<xs:sequence>
<xs:element minOccurs="0" name="additionalText" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="additionalText2" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="customerProductId" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="eanCodeOrderUnit" nillable="true" type="xs:string"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="error" nillable="true" type="ns:Error"/>
<xs:element minOccurs="0" name="haltDescriptionItem" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="price" nillable="true" type="xs:decimal"/>
<xs:element minOccurs="0" name="productId" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="quantity" type="xs:double"/>
</xs:sequence>
</xs:complexType>
<xs:element name="checkOrderResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="ns:Order"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="submitOrder">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="order" nillable="true" type="ns:Order"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="submitOrderResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="ns:Order"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
et le résultat (en partie)
package com.softm.pau.shop.xsd;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Address", propOrder = {
"city",
"country",
"createAddress",
"name",
"name2",
"name3",
"name4",
"street",
"zip"
})
public class Address {
@XmlElementRef(name = "city", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> city;
@XmlElementRef(name = "country", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> country;
protected Object createAddress;
@XmlElementRef(name = "name", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> name;
@XmlElementRef(name = "name2", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> name2;
@XmlElementRef(name = "name3", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> name3;
@XmlElementRef(name = "name4", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> name4;
@XmlElementRef(name = "street", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> street;
@XmlElementRef(name = "zip", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false)
protected JAXBElement<Object> zip;
Comment puis-je obtenir XmlElement au lieu de XmlElementRef? Que dois-je modifier dans le fichier xsd?
Le xsd est un extrait d'un document wsdl et je veux utiliser les classes obtenues à l'appel
un webservice.
siegfried
OK, certains mor infos ici, ne peut pas répondre à ma propre question...
Je travaille avec STS et Java6. dans mon build.xml est codé
<!-- JAXB-->
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath>
<fileset dir="lib/ct" includes="*.jar" />
</classpath>
</taskdef>
<target name="gen.java" description="Generates the JAXB business objects">
<xjc destdir="src/gen" extension="true">
<schema dir="conf/webapp/WEB-INF/schema" includes="*.xsd" />
<binding dir="resources" includes="*.xjb" />
</xjc>
</target>
Ma liaison.xjb ressemble
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="../conf/webapp/WEB-INF/schema/wsinapa.xsd" node="/s:schema">
<jxb:bindings node="/s:schema/s:element[@name='AccountStatus']">
<jxb:class name="AccountStatusRequest"/>
</jxb:bindings>
</jxb:bindings>
dans le répertoire src dir sont 2 .xsd qui doit être compilé. L'un d'eux est compilé sans
les erreurs, les autres pas. Les deux où est extraite à partir des fichiers wsdl.
acclamations
Siegfried
OriginalL'auteur Siegfried Storr | 2013-01-03
Vous devez vous connecter pour publier un commentaire.
Votre JAXB (JSR-222) mise en œuvre ne génère pas défectueux classes. Le
required
propriété a été ajouté à la@XmlElementRef
les annotations JAXB 2.2.Plus probable que vous avez généré, vous JAXB classes en Java SE 7 (qui comprend JAXB 2.2) et essayez d'exécuter puis dans Java SE 6 (qui comprend JAXB 2.1). À l'aide d'un JAXB 2.2 mise en œuvre, vous pouvez créer JAXB 2.1 (ou JAXB 2.0) compatible code à l'aide de la
-target
drapeau.OriginalL'auteur bdoughan
Je pense que sa n'a rien changer dans xsd. Essayez de créer une liaison de fichier comme ci-dessous, dire simple liaison.xjb.
Ensuite utiliser cette commande lors de la génération de classes java à partir de xsd. Je suppose que vous êtes
wsimport
qui vient avec jdk pour générer des sources.De sorte que vous ne sera pas obtenir de la balise
XmlElementRef
Puis mise à jour xjc paramètre comme ceci : xjc -b simple liaison.xjb
merci de regarder ma mise à jour de question
Avez-vous essayez de mettre à jour votre fichier de liaison comme je l'ai mentionné ? Vous avez besoin d'inclure <jxb:globalBindings generateElementProperty="false"/> entre balise <jxb:liaisons> balises.
oui, je l'ai fait et oui, qui a résolu mon problème. Merci Beaucoup!!
OriginalL'auteur Saravana Kumar
Dans mon projet, le même problème s'est produit parce que l'un des champs d'un type défini dans un fichier XSD a été dupliqué. Donc JAXB était pas en mesure de générer une bonne classe java parce que vous ne pouvez pas avoir deux champs avec le même nom dans une classe java. Comme une solution de contournement JAXB m'a donné la même bizarre de sortie comme dans le post original.
Je sais que ce fil est assez vieux, mais quelqu'un à la recherche d'une solution à un problème similaire pourrait trouver cela utile.
OriginalL'auteur Marek
Si vous utilisez le maven-jaxb2-plugin pour exécuter XJC, vous pouvez exécuter ce même problème. J'ai corrigé par l'ajout d'un
<specVersion>
de2.1
à monpom.xml
. Comme suit:OriginalL'auteur jesseplymale