Description
Andrea Lincetto opened SWS-979 and commented
Trying to dynamically generate WSDL for a Spring WS web service, based on multiple xml schemas. I have a multiple xsd files, all of them are "connected" using xsd:import elements.
Spring WS reference says :
If you want to use multiple schemas, either by includes or imports, you will want to put Commons XMLSchema on the class path. If Commons XMLSchema is on the class path, the above element will follow all XSD imports and includes, and will inline them in the WSDL as a single XSD. This greatly simplifies the deployment of the schemas, which still making it possible to edit them separately.
so I added this maven dependency :
<dependency>
<groupId>org.apache.ws.xmlschema</groupId>
<artifactId>xmlschema-core</artifactId>
<version>2.2.1</version>
</dependency>
and configurated the WSDL builder in this way :
@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"));
}
but the generated WSDL only contains a single schema element (and showing the import with a wrong location).
I had to use XsdSchemaCollection instead of a SimpleXsdSchema; in addition I had to set to true the "inline" parameter of the collection.
@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;
}
Affects: 2.3.1
Reference URL: http://stackoverflow.com/questions/42112775/spring-ws-wsdl-automatic-exposure-xsd-import-are-not-followed/