IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Forcer une classe dans un XSD


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut Forcer une classe dans un XSD
    Bonjour à tous,

    Comment peut-on forcer l'utilisation d'une classe existante ailleurs comme superclasse ?

    Contexte: Je travaille sur deux projets Maven : "A" et "C".

    Dans le projet "A", j'ai la classe "Animal". Le bean d'Animal a été généré avec "jaxb2-maven-plugin" depuis Maven. Et le XSD d'Animal ressemble au suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?xml version="1.0"  encoding="UTF-8"?>
    <xs:schema version="1.0"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:com="http://xsd.masociete.com/common/"
        elementFormDefault="qualified"
        targetNamespace="http://xsd.masociete.com/common/">
     
        <xs:element name="animal" type="com:animal"/>
     
        <xs:complexType name="animal">
            <xs:annotation>
                <xs:documentation>An animal</xs:documentation>
            </xs:annotation>
            <xs:choice>
                ...
            </xs:choice>
        </xs:complexType>
     
        ...
     
    </xs:schema>
    Dans mon "pom.xml", la conf est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <plugin>
    	<groupId>org.codehaus.mojo</groupId>
    	<artifactId>jaxb2-maven-plugin</artifactId>
    	<version>${jaxb2-maven-plugin.version}</version>
    	<executions>
    		<execution>
    			<id>xjc</id>
    			<goals>
    				<goal>xjc</goal>
    			</goals>
    		</execution>
    	</executions>
    	<configuration>
    		<schemaFiles>animal.xsd</schemaFiles>
    		<packageName>com.masociete.jaxb</packageName>
    	</configuration>
    </plugin>
    Dans mon projet "C", qui dépend de "A". J'ai un bean Chien défini en XSD aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    	xmlns:mda="http://masociete.com/c/jaxb" xmlns:com="http://masociete.com/common/"
    	targetNamespace="http://masociete.com/c/jaxb" elementFormDefault="qualified">
     
    	<xs:import schemaLocation="animal.xsd" namespace="http://masociete/common/"/>
     
    	<xs:include schemaLocation="..." />
     
     
    	<xs:element name="chien">
    		<xs:complexType>
    			<xs:annotation>
    				<xs:documentation>Chien</xs:documentation>
    			</xs:annotation>
    			<xs:complexContent>
    				<xs:extension base="com:animal">
    					<xs:sequence>
    						...
    					</xs:sequence>
    				</xs:extension>
    			</xs:complexContent>
    		</xs:complexType>
    	</xs:element>
    Dans mon pom.xml, la conf est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <plugin>
    	<groupId>org.codehaus.mojo</groupId>
    	<artifactId>jaxb2-maven-plugin</artifactId>
    	<version>${jaxb2-maven-plugin.version}</version>
    	<executions>
    		<execution>
    			<id>xjc</id>
    			<goals>
    				<goal>xjc</goal>
    			</goals>
    		</execution>
    	</executions>
    	<configuration>
    		<schemaFiles>chien.xsd,chat.xsd...</schemaFiles>
    		<packageName>com.masociete.c.jaxb</packageName>
    	</configuration>
    </plugin>
    Mais ça me pose deux soucis :
    1) Je dois copier "animal.xsd" de "A" vers "C" pour que ça fonctionne ;
    2) Ca me crée "Animal.java" dans le package "com.masociete.c.jaxb", alors que je l'ai déjà dans "com.masociete.jaxb".

    Au final, ce que j'aurais voulu, c'est un bean généré qui ressemble au suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    package om.masociete.c.jaxb
    ...
     
    public class Chien extends com.masociete.jaxb.animal {
    	...
    }
    Toute aide sera la bienvenue...

    Merci d'avance,
    Thierry
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour Thierry,

    Dans ton projet C je tenterai d'ajouter un fichier de binding jaxb qui ressemble à celui-là (je ne suis pas sûr qu'il y ait toutes les déclarations nécessaires, il faut surement corriger aussi le xpath qui est approximatif) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <jaxb:bindings schemaLocation="../xsd/Schema.xsd" node="/xs:schema">
        <jaxb:bindings node="//xs:extension[@base='com:animal']">
                <jaxb:class name="Animal" implClass="com.masociete.jaxb.Animal"/>
        </jaxb:bindings>
    </jaxb:bindings>
    Ensuite soit tu le mets dans scr/main/xjb soit tu ajoutes une propriétés à ton jaxb2-maven-plugin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <plugin>
    				<groupId>org.codehaus.mojo</groupId>
    				<artifactId>jaxb2-maven-plugin</artifactId>
    				<executions>
    					<execution>
    						<id>_monid</id>
    						<configuration>
    							...
    							<bindingDirectory>${project.basedir}/src/main/xjb</bindingDirectory>
    							...
    						</configuration>
    						<goals>
    							<goal>xjc</goal>
    						</goals>
    					</execution>
    				</executions>
    			</plugin>
    Pas sûr que ça fonctionne mais je tenterai comme ça...

    Romain.

  3. #3
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut
    Entre temps, j'avais écrit le binding suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <?xml version="1.0" encoding="UTF-8"?>
    <jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    	xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
     
    	<jxb:bindings schemaLocation="../xsd/animal.xsd">
    		<jxb:schemaBindings>
    			<jxb:package name="com.masociete.jaxb"></jxb:package>
    		</jxb:schemaBindings>
    	</jxb:bindings>
     
     
    	<jxb:bindings schemaLocation="../xsd/Chien.xsd">
    		<jxb:schemaBindings>
    			<jxb:package name="com.masociete.c.jaxb"></jxb:package>
    		</jxb:schemaBindings>
    	</jxb:bindings>
    </jxb:bindings>
    Ca génère tout comme il faut mais je me retrouve donc avec le package "com.masociete.jaxb" en double, puisqu'un vient de la génération et un vient de la dépendance vers A. Idéalement, il faudrait que celui de C ne soit pas généré, ou alors soit effacé après la génération.

    J'ai essayé ce que tu proposes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <?xml version="1.0" encoding="UTF-8"?>
    <jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    	xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
     
    	<!-- <jxb:bindings schemaLocation="../xsd/animal.xsd">
    		<jxb:schemaBindings>
    			<jxb:package name="com.masociete.jaxb"></jxb:package>
    		</jxb:schemaBindings>
    	</jxb:bindings> -->
     
     
    	<jxb:bindings schemaLocation="../xsd/Chien.xsd">
     
    		<jxb:bindings node="//xs:extension[@base='com:animal']">
    			<jxb:class name="Animal" implClass="com.masociete.jaxb.Animal" />
    		</jxb:bindings>
     
    		<jxb:schemaBindings>
    			<jxb:package name="com.masociete.c.jaxb"></jxb:package>
    		</jxb:schemaBindings>
    	</jxb:bindings>
    </jxb:bindings>
    Mais je me prend un erreur sur la ligne "jxb:class" : La personnalisation class indiquée n'est pas utilisée.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Au final je me dis que ce n'est peut être pas l'extension qu'il faut cibler mais peut-être plus le complexType (ou l'élément ?) vers lequel l'extension fait référence. Est-ce que ceci fonctionne mieux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?xml version="1.0" encoding="UTF-8"?>
    <jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    	xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
     
    	<jxb:bindings schemaLocation="../xsd/Chien.xsd">
     
                    <!-- A tester aussi : //xs:element[@name='animal'] -->
    		<jxb:bindings node="//xs:complexType[@name='animal']">
    			<jxb:class name="Animal" implClass="com.masociete.jaxb.Animal" />
    		</jxb:bindings>
     
    		<jxb:schemaBindings>
    			<jxb:package name="com.masociete.c.jaxb"></jxb:package>
    		</jxb:schemaBindings>
    	</jxb:bindings>
    </jxb:bindings>

  5. #5
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut
    Nop :-(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <jaxb:bindings node="//xs:complexType[@name='animal']">
    	<jaxb:class 
    		name="Animal" 
    		implClass="com.masociete.jaxb.Animal" />
    </jaxb:bindings>

    Ca dit :

    [ERROR] file:/D:/Users/.../xjb/binding.xjb[14,60] com.sun.istack.SAXParseException2; systemId: file:/D:/Users/.../xjb/binding.xjb; lineNumber: 14; columnNumber: 60; L'évaluation XPath de "//xs:complexType[@name='animal']" génère un noeud cible vide

    idem avec @name='com:animal'
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Peut-être que Jaxb ne navigue pas dans les inclusions de schéma. As-tu essayé en changeant le xsd sur lequel s'applique le binding :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?xml version="1.0" encoding="UTF-8"?>
    <jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    	xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
    
    	<jxb:bindings schemaLocation="../xsd/animal.xsd">
                    <!-- A tester aussi : //xs:element[@name='animal'] -->
    		<jxb:bindings node="//xs:complexType[@name='animal']">
    			<jxb:class name="Animal" implClass="com.masociete.jaxb.Animal" />
    		</jxb:bindings>
    	</jxb:bindings>
    	<jxb:bindings schemaLocation="../xsd/Chien.xsd">
    		<jxb:schemaBindings>
    			<jxb:package name="com.masociete.c.jaxb"></jxb:package>
    		</jxb:schemaBindings>
    	</jxb:bindings>
    </jxb:bindings>
    As-tu essayé avec le xpath sur element aussi : //xs:element[@name='animal'] ?

    Romain.

Discussions similaires

  1. [Etat-Transition] Peut on montrer plus d'une classe dans un diagramme d'état-transition ?
    Par thebloodyman dans le forum Autres Diagrammes
    Réponses: 5
    Dernier message: 12/01/2006, 13h56
  2. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36
  3. Sauvegarder/Lire une classe dans un fichier
    Par Rodrigue dans le forum C++
    Réponses: 10
    Dernier message: 10/09/2005, 14h12
  4. Réponses: 4
    Dernier message: 10/02/2005, 16h10
  5. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo