Я занимаюсь разработкой веб-сервиса на основе контракта - во-первых, я создаю схемы 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>
Это сработало для меня, но, как вы видите, все схемы недействительны (нет включений).Это выглядит очень скучно, чтобы комментировать все время, прежде чем выставлять веб-сервис.Кто-нибудь может мне помочь?Как пройти через это?
Так что мне нужен какой-то преобразователь местоположения схемы ...