CXF: присоединение схем xsd для создания WSDL - PullRequest
2 голосов
/ 15 марта 2012

Я занимаюсь разработкой веб-сервиса на основе контракта - во-первых, я создаю схемы xsd, во-вторых, генерирую классы с JAXB на них, а затем я хочу присоединить эти схемы к WSDL.Вот мое приложениеContext, xml:

<jaxws:endpoint id="webService" 
                implementor="#wsImplementer" 
                address="/service">

   <jaxws:schemaLocations>
       <jaxws:schemaLocation>classpath:/xsd/RequestWrapper.xsd</jaxws:schemaLocation>
    </jaxws:schemaLocations>

</jaxws:endpoint>

Проблема в том, что RequestWrapper.xsd содержит <xs:include schemaLocation="ComplexTypes.xsd"/>, а ComplexTypes.xsd содержит <xs:include schemaLocation="SimpleTypes.xsd"/>.Итак, когда CXF генерирует WSDL, он содержит схему RequestWrapper.xsd с таким включением http://service/path?xsd=ComplexTypes.xsd, что нормально, но если вы перейдете по этой ссылке, вы увидите ComplexTypes.xsd с <xs:include schemaLocation="SimpleTypes.xsd"/>.Конечно, это недопустимый WSDL, поскольку он не может загрузить SimpleTypes.xsd.

Мне удалось найти обходной путь:

1) создать новую схему, которая включает в себя:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://custom/data"
       xmlns="http://custom/data">

<xs:include schemaLocation="SimpleTypes.xsd"/>
<xs:include schemaLocation="ComplexTypes.xsd"/>
<xs:include schemaLocation="RequestWrapper.xsd"/>

2) удалитьвсе включения из других схем.

3)

<jaxws:schemaLocations>
       <jaxws:schemaLocation>classpath:/xsd/comprise.xsd</jaxws:schemaLocation>
</jaxws:schemaLocations> 

Это сработало для меня, но, как вы видите, все схемы недействительны (нет включений).Это выглядит очень скучно, чтобы комментировать все время, прежде чем выставлять веб-сервис.Кто-нибудь может мне помочь?Как пройти через это?

Так что мне нужен какой-то преобразователь местоположения схемы ...

1 Ответ

3 голосов
/ 15 марта 2012

Интересно, почему вы указываете схемы xsd в applicationContext.xml? Может быть, я не до конца понимаю ваш вопрос, но когда я разработал веб-сервисы, используя JAXB, я просто включил

<wsdl:definitions name="myWebService" ...>
  <wsdl:types>
    <xsd:schema>
      <xsd:include namespace="your namespace comes here" schemaLocation="RequestWrapper.xsd"/>
    </xsd:schema>
  </wsdl:types>
...other part of wsdl

Таким образом, оболочка запроса включает в себя другие xsd-файлы, и вы можете "включать" в RequestWrapper.xsd столько, сколько вам нужно.

p.s. в импортируемом файле xsd вот так

<import namespace="here your namespace" schemaLocation="common.xsd"/>
...