CXF: подключение схем xsd для создания WSDL

Я разрабатываю веб-сервис в каких-то контрактных условиях - во-первых, я создаю схемы xsd, во-вторых, генерирую на них классы с JAXB, а затем хочу прикрепить эти схемы к WSDL. Вот мой applicationContext,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) delete all the includes from the other schemes.

3)

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

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

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


person Dmitry    schedule 15.03.2012    source источник


Ответы (1)


Интересно, почему вы указываете схемы 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"/>
person Didar Burmaganov    schedule 15.03.2012
comment
Спасибо, Дидар Бурмаганов, за немедленный ответ. Проблема в том, что CXF сам создает WSDL. Поэтому, чтобы заставить его использовать мои xsd, мне нужно дать их ему. - person Dmitry; 15.03.2012
comment
Дмитрий пробовал? stackoverflow.com/questions/6955655/ может быть, это поможет вам! Таким образом, вы берете сгенерированный wsdl, добавляете include и говорите CXF взять из вашего WSDL. Этот обходной путь не годится, если вы часто вносите изменения в файл WSDL, потому что вам нужно будет создать его снова и добавить include. Должна быть более автоматизированная версия этого. - person Didar Burmaganov; 15.03.2012
comment
Да, я думал о разработке wsdl самостоятельно. Это сложно, но похоже, что другого выхода нет: мой обходной путь или wsdl вручную =) Надеюсь, кто-нибудь выложит другой вариант =) - person Dmitry; 15.03.2012
comment
Разработка с нуля файла WSDL может вызвать проблемы (отсутствие проверки на наличие ошибок). Я думал о следующем сценарии: 1. сгенерировать WSDL с помощью apache (выбросить мусор xsd, чтобы заменить его собственным файлом xsd) 2. вставить include xsd. Итак, когда вы меняете класс веб-службы (аннотированный @WebService), вы повторяете описанные выше шаги :) Надеюсь, поможет. - person Didar Burmaganov; 15.03.2012
comment
Дидар Бурмаганов, большое спасибо. Кстати, у eclipse есть плагин для создания WSDL =). - person Dmitry; 15.03.2012