Si le problème que vous voyez est dû à des classes imbriquées ayant le même nom que les classes parent selon le lien fourni:
Ensuite, vous pouvez contourner ce problème en utilisant un fichier de liaisons externes:
recursive.xml
Le fichier de liaison vous permet de renommer les classes imbriquées pour éviter le conflit de noms.
<jaxb:bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="recursive.xsd">
<jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
<jaxb:class name="Topic2"/>
</jaxb:bindings>
<jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
<jaxb:class name="Topic3"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
recursive.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="topic">
<xs:complexType>
<xs:sequence>
<xs:element name="topic" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="topic" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="topic" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XJC appel
Le fichier de liaison est spécifié dans l'appel de XJC:
xjc -d out -b recursive.xml recursive.xsd
Sujet (Gener Classe Ated)
package generated;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"topic"
})
@XmlRootElement(name = "topic")
public class Topic {
@XmlElement(required = true)
protected Topic.Topic2 topic;
public Topic.Topic2 getTopic() {
return topic;
}
public void setTopic(Topic.Topic2 value) {
this.topic = value;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"topic"
})
public static class Topic2 {
@XmlElement(required = true)
protected Topic.Topic2 .Topic3 topic;
public Topic.Topic2 .Topic3 getTopic() {
return topic;
}
public void setTopic(Topic.Topic2 .Topic3 value) {
this.topic = value;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"topic"
})
public static class Topic3 {
protected List<String> topic;
public List<String> getTopic() {
if (topic == null) {
topic = new ArrayList<String>();
}
return this.topic;
}
}
}
}
Yikes! Pourquoi xjc n'a-t-il pas travaillé sur le schéma? Un outil automatisé est certainement le meilleur choix ici! Il vaut mieux réparer le XSD que d'essayer d'écrire un cas de test pour couvrir toutes les conditions aux limites ... – maerics
Le schéma est défini par d'autres groupes, donc je ne peux pas le réparer, mais je ne suis pas sûr qu'il soit cassé. J'ai travaillé sur les mappages de liaison pour que XJC puisse fonctionner. Cependant le code résultant ne compilera pas, le schéma utilise l'imbrication récursive, xjc ne peut pas sembler s'occuper de cela. J'ai rencontré ce problème [https://forums.oracle.com/forums/thread.jspa?messageID=9259888] Je n'ai pas encore essayé de le faire à la main pour voir s'il est possible de le traiter. – Nate