2013-04-03 9 views
0

У меня есть wsdl (у меня нет файла .xsd), и я хочу сгенерировать классы из него. Использование wsimport Я получаю дерево классов, которое является стандартным отображением самих схем webservice и его зависимостей. Я получаю что-то вроде com -> (microsoft, mycompany), org -> (apache).jaxb привязка настроек без наличия xsd

Однако мне нужно переназначить пакет com.mycompany и все классы внутри com.mycompany.test.

Итак, я попытался использовать опцию -b импорта ws, создав docbinding.xml, который является XML-схемой настройки схемы. Содержание:

<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> 

запуска wsimport с этим синтаксисом:

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

я получить первоначальную ошибку, которая останавливает генерацию классов:

[ERROR] XPath error: null 
... 

Как я могу исправить связывание XML?

ответ

1

Если типы находятся в отдельных XSD-файлах. Это способ сделать это.

Создайте два конфигурационных файла.

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> 

Создайте пакетный файл в том же каталоге

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/ . 

Смотрите, если это работает для вас. Обязательно отредактируйте файлы JXB соответствующим образом для своих местоположений wsdl/xsd и требуемых пакетов.