In this article, we will see the configuration of a simple web service Example.
For this, we annotate a class with @WebService and @Stateless.
Step 1: No external xml files are needed. The below class will be placed in a jar or war and deployed into a compliant Java EE server like TomEE.
import javax.ejb.Stateless; import javax.jws.WebService; @Stateless @WebService( portName = "CalculatorPort", serviceName = "CalculatorService", targetNamespace = "https://superbiz.org/wsdl", endpointInterface = "org.superbiz.calculator.ws.CalculatorWs") public class Calculator implements CalculatorWs { public int sum(int add1, int add2) { return add1 + add2; } public int multiply(int mul1, int mul2) { return mul1 * mul2; } }
Step 2: @WebService Endpoint Interface
import javax.jws.WebService; @WebService(targetNamespace = "https://superbiz.org/wsdl") public interface CalculatorWs { public int sum(int add1, int add2); public int multiply(int mul1, int mul2); }
Step 3: Calculator WSDL
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/" name="CalculatorService" targetNamespace="https://superbiz.org/wsdl" xmlns:soap="https://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="https://superbiz.org/wsdl" xmlns:xsd="https://www.w3.org/2001/XMLSchema"> <wsdl:types> <xsd:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="https://superbiz.org/wsdl" xmlns:tns="https://superbiz.org/wsdl" xmlns:xsd="https://www.w3.org/2001/XMLSchema"> <xsd:element name="multiply" type="tns:multiply"/> <xsd:complexType name="multiply"> <xsd:sequence> <xsd:element name="arg0" type="xsd:int"/> <xsd:element name="arg1" type="xsd:int"/> </xsd:sequence> </xsd:complexType> <xsd:element name="multiplyResponse" type="tns:multiplyResponse"/> <xsd:complexType name="multiplyResponse"> <xsd:sequence> <xsd:element name="return" type="xsd:int"/> </xsd:sequence> </xsd:complexType> <xsd:element name="sum" type="tns:sum"/> <xsd:complexType name="sum"> <xsd:sequence> <xsd:element name="arg0" type="xsd:int"/> <xsd:element name="arg1" type="xsd:int"/> </xsd:sequence> </xsd:complexType> <xsd:element name="sumResponse" type="tns:sumResponse"/> <xsd:complexType name="sumResponse"> <xsd:sequence> <xsd:element name="return" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> <wsdl:message name="multiplyResponse"> <wsdl:part element="tns:multiplyResponse" name="parameters"/> </wsdl:message> <wsdl:message name="sumResponse"> <wsdl:part element="tns:sumResponse" name="parameters"/> </wsdl:message> <wsdl:message name="sum"> <wsdl:part element="tns:sum" name="parameters"/> </wsdl:message> <wsdl:message name="multiply"> <wsdl:part element="tns:multiply" name="parameters"/> </wsdl:message> <wsdl:portType name="CalculatorWs"> <wsdl:operation name="multiply"> <wsdl:input message="tns:multiply" name="multiply"/> <wsdl:output message="tns:multiplyResponse" name="multiplyResponse"/> </wsdl:operation> <wsdl:operation name="sum"> <wsdl:input message="tns:sum" name="sum"/> <wsdl:output message="tns:sumResponse" name="sumResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="CalculatorServiceSoapBinding" type="tns:CalculatorWs"> <soap:binding style="document" transport="https://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="multiply"> <soap:operation soapAction="" style="document"/> <wsdl:input name="multiply"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="multiplyResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="sum"> <soap:operation soapAction="" style="document"/> <wsdl:input name="sum"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="sumResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="CalculatorService"> <wsdl:port binding="tns:CalculatorServiceSoapBinding" name="CalculatorPort"> <soap:address location="https://127.0.0.1:4204/Calculator?wsdl"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
Step 4: Accessing the @WebService with javax.xml.ws.Service
import org.junit.BeforeClass; import org.junit.Test; import javax.ejb.embeddable.EJBContainer; import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; import java.util.Properties; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class CalculatorTest { @BeforeClass public static void setUp() throws Exception { Properties properties = new Properties(); properties.setProperty("openejb.embedded.remotable", "true"); //properties.setProperty("httpejbd.print", "true"); //properties.setProperty("httpejbd.indent.xml", "true"); EJBContainer.createEJBContainer(properties); } @Test public void test() throws Exception { Service calculatorService = Service.create( new URL("https://127.0.0.1:4204/Calculator?wsdl"), new QName("https://superbiz.org/wsdl", "CalculatorService")); assertNotNull(calculatorService); CalculatorWs calculator = calculatorService.getPort(CalculatorWs.class); assertEquals(10, calculator.sum(4, 6)); assertEquals(12, calculator.multiply(3, 4)); } }
Inspecting the messages in Web Service Example
sum(int, int)
Request SOAP message:
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:sum xmlns:ns1="https://superbiz.org/wsdl"> <arg0>4</arg0> <arg1>6</arg1> </ns1:sum> </soap:Body> </soap:Envelope>
Response SOAP message:
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:sumResponse xmlns:ns1="https://superbiz.org/wsdl"> <return>10</return> </ns1:sumResponse> </soap:Body> </soap:Envelope>
multiply(int, int)
Request SOAP message:
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:multiply xmlns:ns1="https://superbiz.org/wsdl"> <arg0>3</arg0> <arg1>4</arg1> </ns1:multiply> </soap:Body> </soap:Envelope>
Response SOAP message:
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:multiplyResponse xmlns:ns1="https://superbiz.org/wsdl"> <return>12</return> </ns1:multiplyResponse> </soap:Body> </soap:Envelope>