2013-04-03 2 views
0

J'ai un wsdl (je n'ai pas le fichier .xsd) et je veux générer les classes à partir de ce fichier. Utilisation de wsimport Je reçois un arbre de classes qui est le mappage standard des schémas de service Web lui-même et de ses dépendances. J'obtiens quelque chose comme com -> (microsoft, mycompany), org -> (apache).personnalisation de liaison jaxb sans avoir xsd

Cependant, j'ai besoin de remapper le paquet com.mycompany et toutes les classes à l'intérieur de com.mycompany.test.

J'ai donc essayé d'utiliser l'option -b de ws import en créant un docbinding.xml qui est XML de personnalisation de schéma. Le contenu est:

<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"  xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<jxb:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://mycompany.com/test/']"> 
<jaxb:package name="com.mycompany.test"/> 
</jxb:bindings> 
</jxb:bindings> 

lancement wsimport avec cette syntaxe:

wsimport -p com.mycompany -b docbinding.xml https://mycompany.com/nicews/test.svc?wsdl 

j'obtenir une erreur initiale qui arrête la génération des classes:

[ERROR] XPath error: null 
... 

Comment puis-je fixer la liaison XML?

Répondre

1

Si les types sont dans des fichiers XSD distincts. C'est la façon de le faire.

Créez deux fichiers de configuration.

wsdl.jxb

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    wsdlLocation="https://mycompany.com/nicews/test.svc?wsdl" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> 
    <jaxws:package name="com.mycompany.wsdl"/> <!-- namespace what you want here --> 
</jaxws:bindings> 

xsds.jxb

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

    <!-- This is used becuase we don't need to differentiate between absent and nil elements, you may want to differentiate. If so, remove this binding --> 
    <jaxb:globalBindings generateElementProperty="false"> 
     <xjc:simple /> 
    </jaxb:globalBindings> 

    <!-- REPEAT THIS SECTION FOR EACH XSD, replacing schemaLocation and package with whatever you want --> 
    <jaxb:bindings 
      schemaLocation="http://mycompany.com/someWsdlIncludeLocation?xsd=xsd0" 
      node="/xs:schema"> 
      <jaxb:schemaBindings> 
     <jaxb:package name="com.mycompany.dto.saml" /> 
      </jaxb:schemaBindings> 
    </jaxb:bindings> 
    <!-- END SECTION --> 
</jaxb:bindings> 

Créer un fichier de commandes dans le même répertoire

rmdir /S /Q build 
rmdir /S /Q dist 
rmdir /S /Q src 
mkdir build 
mkdir dist 
mkdir src 
"%JAVA_HOME%\bin\wsimport.exe" -b wsdl.jxb -b xsds.jxb -s src -d build -keep http://mycompany.com/someWSDLlocation?wsdl 
"%java_home%\bin\jar" cf dist/mycompanyClient.jar -C build/ . 
"%java_home%\bin\jar" cf dist/mycompanyClient-src.jar -C src/ . 

voir si cela fonctionne pour vous. Assurez-vous de modifier les fichiers JXB de manière appropriée pour vos emplacements wsdl/xsd et les paquets que vous voulez.