J'utilise actuellement JAXB pour générer des classes Java afin de démarchander le XML. J'aimerais maintenant créer un nouveau schéma très similaire au premier et faire en sorte que les classes générées mettent en œuvre la même interface.
Disons, par exemple, que j'ai deux fichiers de schéma qui définissent le XML avec des balises similaires :
adulte.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="Job" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
enfant.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="School" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
En utilisant JAXB et XJC, je voudrais générer deux fichiers de classe :
public class Adult implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getJob { ... }
}
public class Kid implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getSchool { ... }
}
où l'interface Person définit le getName()
y getAge()
méthodes.
J'ai regardé certaines des documentation pour le mappage des interfaces, mais il semble que ce soit uniquement pour la situation où vous avez déjà des classes Java que vous voulez mapper sur un DOM.
Aussi, j'ai essayé d'utiliser ce plugin externe mais cela ne semble pas fonctionner. Voici mon fichier de liaison xjb :
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:ext="http://xml.w-wins.com/xjc-plugins/interfaces"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="xsd/adult.xsd" node="xs:schema/xs:complexType[@name='Person']">
<ext:interface>mypackage.Hello</ext:interface>
</jxb:bindings>
</jxb:bindings>
mais cela donne l'erreur suivante :
$ java -cp "lib/activation.jar;lib/InterfacesXJCPlugin.jar;lib/jaxb1-impl.jar;lib/jaxb-api.jar;lib/jaxb-xjc.jar;lib/jsr173_1.0_api.jar" com.sun.tools.xjc.XJCFacade -p mypackage.myxml -extension -Xinterfaces xsd/adult.xsd -b binding.xjb
parsing a schema...
[ERROR] XPath evaluation of "xs:schema/xs:complexType[@name='Person']" results in empty target node
line 8 of file:/C:/dev/jaxb/jaxb-ri/binding.xjb
Failed to parse a schema.
Est-il possible de générer avec JAXB une classe qui implémente une interface ?
Mise à jour
J'ai essayé d'utiliser le Insertion d'interface mais pour une raison quelconque, je n'arrive pas à le faire fonctionner. Voici comment j'appelle xjc, mais c'est comme si le jar du plugin n'était pas récupéré dans le classpath :
$ java -cp "lib/xjc-if-ins.jar;lib/jaxb-xjc.jar" com.sun.tools.xjc.XJCFacade -p mypackage -extension -Xifins myschema.xsd -b binding.xjb
Je reçois l'erreur :
unrecognized parameter -Xifins
Des idées ?
0 votes
Le plugin Interface Insertion peut être utilisé pour qu'une classe générée à partir d'un élément XSD implémente une certaine interface. Ici, vous voulez générer une classe basée sur son nom de schéma - vous aurez besoin d'un autre plugin pour le faire. J'ai réussi à faire fonctionner l'insertion d'interface avec maven. Faites-moi savoir si vous avez besoin des détails. Les sources de l'insertion d'interface sont ici : jaxb2-commons.dev.java.net/interface-insertion/
0 votes
<xjc:superInterface> est la voie à suivre.