Creating A Web Service

Let's put the theory into practice to create a sample web service!

  • In the src/ directory of your module, create a new java interface called "HelloWorld". Copy the following into that interface:

    import javax.jws.WebParam;
    import javax.jws.WebService;
     
    import org.apache.cxf.annotations.WSDLDocumentation;
    import org.apache.cxf.annotations.WSDLDocumentationCollection;
     
    @WebService
    @WSDLDocumentationCollection({
    @WSDLDocumentation("A Hello World SOAP Web Service"),
    @WSDLDocumentation(value = "A hello world soap web service providing operation sayHi", placement = WSDLDocumentation.Placement.TOP), })
    public interface HelloWorld {
    @WSDLDocumentationCollection({ @WSDLDocumentation("Says Hi"),
    @WSDLDocumentation(value = "Takes String input", placement = WSDLDocumentation.Placement.INPUT_MESSAGE),
    @WSDLDocumentation(value = "Returns a String output", placement = WSDLDocumentation.Placement.OUTPUT_MESSAGE) })
    String sayHi(@WebParam(name = "text") String text);
     
    }

    This creates a new WebService contract, with a single method called "sayHi".

    The @WebService annotation marks this java interface as a web service interface. The @WebService annotation will also be used later to mark a Java class as implementing a web service.

    The @WebParam annotation customizes the mapping of a parameter to a web service message part. For example, the parameter can be exposed with a different name than the one defined in the method using the "name" property of the annotation

    The @WSDLDocumentationCollection and @WSDLDocumentation annotations are used for documenting the WSDL. They are part of the Apache CXF library, which is used by ONE's Platform to handle SOAP. The @WSDLDocumentation annotation provides documentation inside different elements in the generated WSDL. The @WSDLDocumentationCollection annotation is used to group together more than one @WSDLDocumentation annotations.

    [OPTIONAL] You can use @WebMethod annotation to customize a method that is exposed as a web service operation. The @WebMethod annotation has optional properties to set action, an operation name that exposes this method with a different name, and a boolean flag that can be used to mark a method to NOT be exposed as a web method.

  • Next, create a class HelloWorldImpl which implements the interface above. Be sure to replace yourpackagehere with the actual interface package.

    import javax.jws.WebService;
    import com.onenetwork.platform.integ.soap.BaseSOAPService;
     
    @WebService(endpointInterface = "com.onenetwork.platformapitestmodule.ws2.HelloWorld", serviceName = "PCTA.HelloWorld")
    public class HelloWorldImpl extends BaseSOAPService implements HelloWorld {
     
    public String sayHi(String text) {
    return "Hello " + getPlatformUserContext().getUserName() + ": " + text;
    }
     
    }

    This provides an implementation of the HelloWorld web service. Please note that it extends BaseSOAPService; this base class provides useful methods, such as getPlatformUserContext().

    The @WebService annotation defines the endpoint interface, service name, etc.

  • Finally, register the service in the spring "beans" file located at modulebasepkg/moduleprefix-app-context.xml:

    <jaxws:endpoint id="PCTA.Hello"
    implementor="yourpackagehere.HelloWorldImpl"
    address="/PCTA/hello"/>

    Available SOAP Services

    The registered web service will now be displayed under http://localhost/oms/services/ . This includes hyperlinks to WSDLs which can be used to generate client code.images/download/attachments/144836061/web_services_listing_page-version-1-modificationdate-1645136927000-api-v2.png

    Accessing WSDL

    The WSDL can be accessed by clicking on the link next to "WSDL:" in the Available SOAP Services web page. A sample HelloWorld WSDL is shown below.

    NOTE: The @WSDLDocumentation annotation defined on the web service interface with placement parameter as WSDLDocumentation.Placement.TOP is shown in the WSDL as part of wsdl:documentation element at the beginning of the file.

    <wsdl:documentation>A hello world soap web service providing operations for sayHi and getSampleWsVal</wsdl:documentation>
    <wsdl:types>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws2.platformapitestmodule.onenetwork.com/" elementFormDefault="unqualified" targetNamespace="http://ws2.platformapitestmodule.onenetwork.com/" version="1.0">
    <xs:element name="sayHi" type="tns:sayHi"/>
    <xs:element name="sayHiResponse" type="tns:sayHiResponse"/>
    <xs:complexType name="sayHi">
    <xs:sequence>
    <xs:element minOccurs="0" name="text" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="sayHiResponse">
    <xs:sequence>
    <xs:element minOccurs="0" name="return" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    </xs:schema>
    </wsdl:types>
    <wsdl:message name="sayHiResponse">
    <wsdl:documentation>Returns a String output</wsdl:documentation>
    <wsdl:part element="tns:sayHiResponse" name="parameters">
    </wsdl:part>
    </wsdl:message>
    <wsdl:message name="sayHi">
    <wsdl:documentation>Takes String input</wsdl:documentation>
    <wsdl:part element="tns:sayHi" name="parameters">
    </wsdl:part>
    </wsdl:message>
    <wsdl:portType name="HelloWorld">
    <wsdl:documentation>A Hello World SOAP Web Service</wsdl:documentation>
    <wsdl:operation name="sayHi">
    <wsdl:documentation>Says Hi</wsdl:documentation>
    <wsdl:input message="tns:sayHi" name="sayHi">
    </wsdl:input>
    <wsdl:output message="tns:sayHiResponse" name="sayHiResponse">
    </wsdl:output>
    </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="PCTA.HelloWorldSoapBinding" type="tns:HelloWorld">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="sayHi">
    <soap:operation soapAction="" style="document"/>
    <wsdl:input name="sayHi">
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="sayHiResponse">
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="PCTA.HelloWorld">
    <wsdl:port binding="tns:PCTA.HelloWorldSoapBinding" name="HelloWorldImplPort">
    <soap:address location="http://localhost/oms/services/PCTA/HW"/>
    </wsdl:port>
    </wsdl:service>
    </wsdl:definitions>