If you want to experiment with webservices by providing several alternative implementations of the same webservice (represented by the <wsdl:service> element), each having its own URL, and you’re using Websphere 7 and JAX-WS, then:
- For each alternative implementation, add <wsdl:port> with a unique name under the <wsdl:service> element in the WSDL file. Beware: This is essential to enable multiple implementations.
- For each alternative implementation, define a servlet and servlet mapping in web.xml like this:
<servlet id="$IMPLEMENTATION_CLASS_NAME$"> <servlet-name>$IMPLEMENTATION_CLASS_NAME$</servlet-name> <servlet-class>$IMPLEMENTATION_CLASS_NAME$</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>$IMPLEMENTATION_CLASS_NAME$</servlet-name> <url-pattern>/$DESIRED_UNIQUE_URL$</url-pattern> </servlet-mapping>
- Create the implementations – likely as POJOs denoted with the @WebService annotation – and set the corresponding portName for each of them (@WebService(portName=”<unique port name>”, …))
- Deploy and use
1. Define a unique wsdl:port for each implementation
As mentioned, it’s necessary to define a unique wsdl:port for each implementation.
We define two ports, LearningActivityPort1 and LearningActivityPort2, using the same port type (i.e. the same transport protocol etc.).
LearningActivity.wsdl:
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions ...> <wsdl:types>...</wsdl:types> <wsdl:message ...>...</wsdl:message> <wsdl:portType name="DefaultPortType">...</wsdl:portType> <wsdl:binding name="LearningActivityHttpBinding" type=...>...</wsdl:binding> <wsdl:service name="LearningActivityHttpService"> <wsdl:port binding="tns:LearningActivityHttpBinding" name="LearningActivityPort1"> <soap:address location="http://example.com/myApp/LearningActivityHttpService" /> </wsdl:port> <wsdl:port binding="tns:LearningActivityHttpBinding" name="LearningActivityPort2"> <soap:address location="http://example.com/myApp/LearningActivityRawXmlService" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
2. Define a servlet and servlet mapping for each implementation
Next we need to declare each of the webservice implementation classes as a servlet and define a servlet mapping to assign a unique URL to that implementation as described in WAS help:
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>pokusWeb4was7</display-name> <servlet id="LearningActivityHttpBindingImpl"> <servlet-name>LearningActivityHttpBindingImpl</servlet-name> <servlet-class>example.LearningActivityHttpBindingImpl</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>LearningActivityHttpBindingImpl</servlet-name> <url-pattern>/LearningActivityJaxbService</url-pattern> </servlet-mapping> <servlet id="LearningActivityRawXmlServiceImpl"> <servlet-name>LearningActivityRawXmlServiceImpl</servlet-name> <servlet-class>example.LearningActivityRawXmlServiceImpl</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>LearningActivityRawXmlServiceImpl</servlet-name> <url-pattern>/LearningActivityRawXmlService</url-pattern> </servlet-mapping> <welcome-file-list>...</welcome-file-list> </web-app>
When deployed, the two implementation will be thus available under http://localhost:9080/pokusWeb4was7/LearningActivityHttpService and http://localhost:9080/pokusWeb4was7/LearningActivityRawXmlService.
3. Create each implementation linking it to its port name
Finally we write the two implementation, each being assigned to a different port name:
example.LearningActivityHttpBindingImpl:
@javax.jws.WebService (serviceName="LearningActivityHttpService", portName="LearningActivityPort1") public class LearningActivityHttpBindingImpl{ public TransactionResponseMessage updateLearningActivity(LearningActivityMessage learningActivityMsg) { //... return response; } }
example.LearningActivityRawXmlServiceImpl:
@javax.jws.WebService (serviceName="LearningActivityHttpService", portName="LearningActivityPort2") public class LearningActivityRawXmlServiceImpl{ public TransactionResponseMessage updateLearningActivity(LearningActivityMessage learningActivityMsg) { //... return response; } }
Closing notes
Notice that with JAX-WS
- You don’t need webservice.xml – all the necessary information is (may be) provided via annotations
- You don’t need to declare the web services in web.xml unless you need some special configuration (as we do here)