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