5

I'm trying to make a very simple web service and am having some difficulties making spring generate the correct wsdl. I've done my best to copy the example from this spring tutorial. If anyone has a clue about what I'm doing wrong I'd really appreciate the help.

In essence, there is a single EndPoint called IncidentHeaderEndpoint (which currently has no functionality). I want calling clients send an xml request in the form:

<browseIncidents>
    <responsibleManager>foo</responsibleManager>
</browseIncidents>

My EndPoint looks like this:

public class IncidentHeaderEndpoint extends AbstractJDomPayloadEndpoint {
    XPath respMgrExpression;

    public IncidentHeaderEndpoint() {
        Namespace namespace = Namespace.getNamespace("trust-service", "http://act-informatics.co.uk/trust-service/schemas");
        try {
            respMgrExpression = XPath.newInstance("//trust-service:StartDate");
            respMgrExpression.addNamespace(namespace);
        } catch (JDOMException e) {
            e.printStackTrace();
        }
    }
    protected Element invokeInternal(Element request) throws Exception {
        String respMgr = respMgrExpression.valueOf(request);
        return null;
    }
}

When I deploy in tomcat I get the following warnings:

14-Oct-2010 13:08:43 org.springframework.ws.wsdl.wsdl11.provider.DefaultMessagesProvider addMessages
WARNING: No messages were created, make sure the referenced schema(s) contain elements
14-Oct-2010 13:08:43 org.springframework.ws.wsdl.wsdl11.provider.AbstractPortTypesProvider createOperations
WARNING: No operations were created, make sure the WSDL contains messages

This is my spring config:

<!-- TRUST WEB SERVICES -->
<bean id="incidentHeaderEndpoint" class="co.uk.act.cics.ws.IncidentHeaderEndpoint" />

<!-- Routing Mapping -->
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
    <property name="mappings">
        <props>
            <prop key="{http://act-informatics.co.uk/trust-service/schemas}BrowseIncidents">incidentHeaderEndpoint</prop>
        </props>
    </property>
    <property name="interceptors">
        <bean
            class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" />
    </property>
</bean>

<!-- WSDL Generation -->
<bean id="browse" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
    <property name="schema" ref="trust-schema" />
    <property name="portTypeName" value="TrustService" />
    <property name="locationUri" value="http://localhost:8080/trust-service/browseIncidents/" />
    <property name="targetNamespace" value="http://act-informatics.co.uk/trust-service/definitions"/> 
</bean>

<bean id="trust-schema" class="org.springframework.xml.xsd.SimpleXsdSchema">
    <property name="xsd" value="/WEB-INF/trust-service.xsd" />
</bean>

This is my Schema - WEB-INF/trust-service.xsd:

<?xml version="1.0" encoding="UTF-8"?>`
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://act-informatics.co.uk/trust-service/schemas" xmlns:schemas="http://act-informatics.co.uk/trust-service/schemas">
  <xs:element name="browseIncidents">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="responsibleManager" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

and this is the problematic WSDL located at http://localhost:8080/trust-service/browseIncidents/browse.wsdl:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:sch="http://act-informatics.co.uk/trust-service/schemas" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://act-informatics.co.uk/trust-service/definitions" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://act-informatics.co.uk/trust-service/definitions">
  <wsdl:types>
    <xs:schema xmlns:schemas="http://act-informatics.co.uk/trust-service/schemas" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://act-informatics.co.uk/trust-service/schemas">
  <xs:element name="browseIncidents">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="responsibleManager" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
  </wsdl:types>
  <wsdl:portType name="TrustService">
  </wsdl:portType>
  <wsdl:binding name="TrustServiceSoap11" type="tns:TrustService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  </wsdl:binding>
  <wsdl:service name="TrustServiceService">
    <wsdl:port binding="tns:TrustServiceSoap11" name="TrustServiceSoap11">
      <soap:address location="http://localhost:8080/trust-service/browseIncidents/"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
James
  • 1,720
  • 5
  • 29
  • 50
  • Documentation fragment and helping tips are here: https://stackoverflow.com/questions/39094070/springboot-soap-webservice-dynamic-wsdl-generation-not-working-if-remove-request – Andrey Smirnov Jun 14 '18 at 07:30

1 Answers1

19

The input and output element names in your xsd should have suffix as Request and Response. then only spring-ws will identify it as input and output parameters.

if you have elements OrderRequest and OrderResponse, an operation with name Order will get created with input and output as OrderRequest and OrderResponse

Muthu
  • 211
  • 1
  • 6
  • 1
    Thanks this works but am I missing something.I don't see documented anywhere. – mujib ishola Aug 07 '15 at 09:11
  • Using Spring, say you are generating a DefaultWsdl11Definition, then you can specify the desired suffix using "setRequestSuffix" and "setResponseSuffix". – ormurin Jun 07 '22 at 12:14