web-dev-qa-db-fra.com

Application d'un fichier de liaison JAXB externe aux éléments de schéma importés à partir de WSDL

L'expression XPath dans mes fichiers de liaison externes ne peut pas cibler les éléments de mes schémas XML importés dans mon WSDL.

Tout fonctionne si je personnalise la liaison en ligne, mais je voulais vraiment avoir des fichiers de liaison externes de cette manière. Je n'écrase jamais accidentellement les fichiers contenant mes personnalisations. 

Le début de mon fichier de liaison:

<jaxb:bindings
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
    xmlns:jaxws="http://Java.Sun.com/xml/ns/jaxws"
    version="2.1">
    <jaxb:bindings schemaLocation="../wsdl/localhost_7001/ExampleSessionBean/ExampleSessionBeanService.wsdl#types?schema1">
        <jaxb:bindings node="//xs:schema[@targetNamespace='urn:myExample']">

Mon WSDL contient:

<types>
<xsd:schema>
<xsd:import namespace="urn:myExample" schemaLocation="http://localhost:7001/ExampleSessionBean/ExampleSessionBeanService?xsd=1"/>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://ejbs/" schemaLocation="http://localhost:7001/ExampleSessionBean/ExampleSessionBeanService?xsd=2"/>
</xsd:schema>
</types>

Quoi que je fasse, XPath ne trouve rien dans les schémas xsd: importés. L'erreur que je reçois est:

[ERROR] XPath evaluation of "//xs:schema[@targetNamespace='urn:myExample']" results in empty target node

J'ai essayé d'accéder à xs: schéma par numéro d'index au lieu de l'espace de noms et cela ne fonctionne pas non plus. Il semble que mes expressions XPath ne puissent pas atteindre les éléments des schémas importés ... est-il possible de résoudre ce problème?

Il s'agit d'un projet Java SE 7 en cours de développement sous NetBean 7.2. J'utilise NetBeans pour faire tout ce que je fais dans wsimport si cela compte, mais le résultat de la commande semble assez standard pour RI/Metro.

EDIT: J'ai réalisé que je pouvais faire fonctionner un fichier de liaison externe si j'utilisais SCD. Cet exemple XPath ne fonctionne pas:

<bindings node="//xsd:schema[@targetNamespace='urn:myExample']">
    <bindings node="//xs:complexType[@name='myType']">
        <class name="MyClass"/>
    </bindings>
</bindings>

Mais cet exemple SCD fait.

<bindings scd="x-schema::tns" xmlns:tns="urn:myExample">
    <bindings scd="~tns:myType">
        <class name="MyClass"/>
    </bindings>
</bindings>

Est-il connu que XPath ne fonctionne pas dans les fichiers xjb lorsque wsimport est utilisé mais que SCD le fait?

14
Chase

vous devriez l'utiliser comme:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://duke.example.org']">
    <jaxb:schemaBindings>
        <jaxb:package name="fromwsdl.server"/>
    </jaxb:schemaBindings>
</jaxws:bindings>

Attention aux espaces de noms

Tout est expliqué ici: https://jax-ws.Java.net/nonav/2.1.2/docs/customizations.html

7
elro

Vous pouvez compiler chacun des schémas XML en classes Java individuellement. Vous pouvez ensuite exploiter les fichiers d'épisodes pour que les classes générées puissent être utilisées lors de la compilation de schémas qui importent ce schéma XML.

Vous trouverez ci-dessous un exemple de la manière dont vous créez un fichier d’épisode.

xjc -b binding1.xml -episode common.episode common.xsd

Et ci-dessous est un exemple de comment vous consommez et fichier d'épisode. Le fichier épisode est simplement un fichier de liaisons externes JAXB et est donc spécifié à l'aide de l'indicateur -b.

xjc -d out main.xsd -extension -b common.episode   

Pour plus d'informations

5
Blaise Doughan

Pour les nouvelles personnes, vous pouvez simplement utiliser deux fichiers de liaison, l'un appliqué à wsdl et l'autre au schéma en utilisant l'option -b de la classe de génération de code wsdl2Java cxf accepte plusieurs fichiers de liaison:

<Java classname="org.Apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
    <arg value="-d"/>
    <arg value="${src}"/>
    <arg value="-b"/>
    <arg value="${wsdl.home}\jaxws-bindings.xml"/>
    <arg value="-b"/>
    <arg value="${wsdl.home}\jaxb-bindings.xml"/>
    <arg value="${wsdl.home}\YOUR_WSDL.wsdl"/>
    <classpath>
        <path refid="cxf.classpath"/>
    </classpath>
</Java>

Contenu du fichier 'jaxws-bindings.xml':

<jaxws:bindings wsdlLocation="YOUR_WSDL.wsdl"
                xmlns:jaxws="http://Java.Sun.com/xml/ns/jaxws"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
</jaxws:bindings>

Contenu de 'jaxb-bindings.xml':

<jaxb:bindings xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
               jaxb:version="2.0">
    <jaxb:bindings schemaLocation="ManagePartyCustomerDataManagement_PARTY_G7-IOP_In_1.0.xsd">
        <jaxb:bindings node="//xsd:element[@name='eventDate']">
            <jaxb:javaType name="Java.util.Date" 
                       parseMethod="com.sofrecom.gaia.ebs.provider.utils.jaxb.StringDateAdapter.parseDate"
                       printMethod="com.sofrecom.gaia.ebs.provider.utils.jaxb.StringDateAdapter.printDate" />
  </jaxb:bindings>

1
najib.bey

L'ajout de cette section à ma configuration JAXB a permis de supprimer une erreur similaire:

<jaxws:bindings xmlns:jaxws="http://Java.Sun.com/xml/ns/jaxws">
   <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
   <jaxws:enableAsyncMapping>false</jaxws:enableAsyncMapping>
</jaxws:bindings>

Configuration complète:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.1" 
                xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb" 
                xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <jaxws:bindings xmlns:jaxws="http://Java.Sun.com/xml/ns/jaxws">
        <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
        <jaxws:enableAsyncMapping>false</jaxws:enableAsyncMapping>
    </jaxws:bindings>

    <jaxb:bindings schemaLocation="ContactService.wsdl" node="/wsdl:definitions/wsdl:types/xs:schema">
        <jaxb:schemaBindings>
            <jaxb:package name="za.org.kuali.kfs.sys.integration.iapi.contactservice"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>

</jaxb:bindings>

Crédits:

0
xilef