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>

























