2017-02-08 21 views
3

Я пытаюсь динамически генерировать WSDL для веб-службы Spring WS, основанной на нескольких схемах xml. У меня есть несколько xsd-файлов, все они «подключены», используя xsd: import elements.Автоматическая экспозиция Spring WS WSDL: импорт xsd не выполняется

Spring WS ссылка говорит:

Если вы хотите использовать несколько схем, либо включает в себя или импорта, вы хотите поставить Commons XMLSCHEMA на пути к классу. Если Commons XMLSchema находится на пути к классу, указанный выше элемент будет следовать за всеми импортерами XSD и включает в себя и встраивает их в WSDL как один XSD. Это значительно упрощает развертывание схем, которые по-прежнему позволяют редактировать их отдельно.

поэтому я добавил эту Maven зависимость:

<dependency> 
     <groupId>org.apache.ws.xmlschema</groupId> 
     <artifactId>xmlschema-core</artifactId> 
     <version>2.2.1</version> 
    </dependency> 

и сконфигурирован на WSDL строитель следующим образом:

@Bean(name="updateContactService") 
public DefaultWsdl11Definition defaultWsdl11Definition() throws Exception { 
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); 
    wsdl11Definition.setPortTypeName("updateContactPort"); 
    wsdl11Definition.setLocationUri("/ws/updateContact"); 
    wsdl11Definition.setTargetNamespace("http://spring.io/guides/gs-producing-web-service"); 
    wsdl11Definition.setSchema(updateContactXsd()); 
    return wsdl11Definition; 
} 

@Bean 
public XsdSchemaCollection updateContactXsd() throws Exception { 
    return new SimpleXsdSchema(new ClassPathResource("xsds/contact/outboundMessage.xsd")); 
} 

, но сгенерированный WSDL содержит только один элемент схемы (и показывающую импорт с неправильным расположением).

<xs:import namespace="http://xmlns.oracle.com/apps/cdm/foundation/parties/personService/" schemaLocation="personService.xsd"/> 

Любые советы? Весна WS версия 2.3.1

<?xml version="1.0" encoding="UTF-8" standalone="no"?><wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="http://xmlns.oracle.com/apps/crmCommon/content/outboundMessage/types/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://spring.io/guides/gs-producing-web-service" targetNamespace="http://spring.io/guides/gs-producing-web-service"> 
    <wsdl:types> 
    <xs:schema xmlns="http://xmlns.oracle.com/apps/crmCommon/content/outboundMessage/types/" xmlns:ns2="http://xmlns.oracle.com/apps/cdm/foundation/parties/personService/" xmlns:tns0="http://xmlns.oracle.com/apps/crmCommon/content/outboundMessage/types/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/apps/crmCommon/content/outboundMessage/types/"> 
    <xs:import namespace="http://xmlns.oracle.com/apps/cdm/foundation/parties/personService/" schemaLocation="personService.xsd"/> 
    <xs:element name="process" type="tns0:processType"/> 
    <xs:complexType name="processType"> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="Person" type="ns2:Person"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="processResponse" type="tns0:processResponseType"/> 
    <xs:complexType name="processResponseType"> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="Person" type="ns2:Person"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
    </wsdl:types> 
    <wsdl:message name="processResponse"> 
    <wsdl:part element="sch:processResponse" name="processResponse"> 
    </wsdl:part> 
    </wsdl:message> 
    <wsdl:portType name="updateContactPort"> 
    <wsdl:operation name="process"> 
     <wsdl:output message="tns:processResponse" name="processResponse"> 
    </wsdl:output> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="updateContactPortSoap11" type="tns:updateContactPort"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="process"> 
     <soap:operation soapAction=""/> 
     <wsdl:output name="processResponse"> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="updateContactPortService"> 
    <wsdl:port binding="tns:updateContactPortSoap11" name="updateContactPortSoap11"> 
     <soap:address location="https://localhost:4440/ws/updateContact"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

ответ

2

Решено!

Мне пришлось использовать XsdSchemaCollection вместо SimpleXsdSchema; кроме того, мне пришлось установить true «встроенный» параметр коллекции.

@Bean(name="updateContactService") 
public DefaultWsdl11Definition defaultWsdl11Definition() throws Exception { 
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); 
    wsdl11Definition.setPortTypeName("updateContactPort"); 
    wsdl11Definition.setLocationUri("/ws/updateContact"); 
    wsdl11Definition.setTargetNamespace("http://spring.io/guides/gs-producing-web-service"); 
    wsdl11Definition.setSchemaCollection(updateContactXsd()); 
    return wsdl11Definition; 
} 

@Bean 
public XsdSchemaCollection updateContactXsd() throws Exception { 
    CommonsXsdSchemaCollection xsds = new CommonsXsdSchemaCollection(new ClassPathResource("xsds/contact/outboundMessage.xsd")); 
    xsds.setInline(true); <------------------- 
    return xsds; 
} 

Примечание:

xsds.setInline (истина);

Я открою вопрос на Джире, потому что я думаю, что эта ссылка не ясна!

+0

https://jira.spring.io/browse/SWS-979 – lincetto