Jax-WS и Jaxb работают нормально и выполняют привязку пользовательской схемы, когда WSDL хранится в одном файле.
Но когда основной wsdl включает в себя подчиненный wsdl с тегом <xs:import>, привязка JAXB не работает.Цель состоит в том, чтобы изменить имя пакета с org.wrong на org.right
<xs:import>
См. WSDL и файл сопоставления ниже.«Настоящие» wsdls гораздо более громоздки, я просто попытался максимально упростить структуру
Master.wsdl
<wsdl:definitions name="CurrentTimeService" targetNamespace="http://org" xmlns:tns="http://org" xmlns:wrong="http://wrong.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://wrong.org" schemaLocation="slave.wsdl"/> </xs:schema> </wsdl:types> <wsdl:message name="forestMsg"> <wsdl:part element="wrong:Forest" name="Forest" /> </wsdl:message> </wsdl:definitions>
slave.wsdl
<xs:schema targetNamespace="http://wrong.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://wrong.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xs:element name="Forest"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="99" minOccurs="0" name="Apple"> <xs:complexType> <xs:sequence> <xs:element name="Size" type="xsd:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Файл привязки master.xjb:
<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:import[@namespace='http://wrong.org']"> <jaxb:schemaBindings> <jaxb:package name="org.right" /> </jaxb:schemaBindings> </jaxws:bindings> </jaxws:bindings>
Файл привязки slave.xjb:
<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" wsdlLocation="../wsdl/slave.wsdl"> <jaxws:bindings node="xs:schema[@targetNamespace='http://wrong.org']"> <jaxb:schemaBindings map="true"> <jaxb:package name="org.right" /> </jaxb:schemaBindings> </jaxws:bindings> </jaxws:bindings>
Связывание игнорируется.Но если я поместил содержимое slave.wsdl вместо тега <xs:import> в master и слегка изменил файл привязки (удалите slave.xjb и обновите xpath в master.xjb - все работает нормально. Я попытался поменять jaxb на jaxws и наоборот, поиграйте с xpath, оставьте только один из обязательных файлов - ничто не может помочь.
slave.xjb
master.xjb
Xpath верны, если я изменю XPATH на неправильные, CXF выдаст сообщение об ошибке
Любая идея, что можно сделать?