This tutorial will show you how to create client and endpoint communication with WS-Addressing enabled. Creating a WS-Addressing based service and client is very simple. The first step is to create regular JAX-WS service and client configuration; the last step is to configure the addressing on both sides.
The Service
We will start with the following endpoint implementation.
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebService;
@WebService
(
portName = "AddressingServicePort",
serviceName = "AddressingService",
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
endpointInterface = "org.jboss.test.ws.jaxws.samples.wsa.ServiceIface"
)
public class ServiceImpl implements ServiceIface
{
public String sayHello()
{
return "Hello World!";
}
}
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebService;
@WebService
(
portName = "AddressingServicePort",
serviceName = "AddressingService",
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
endpointInterface = "org.jboss.test.ws.jaxws.samples.wsa.ServiceIface"
)
public class ServiceImpl implements ServiceIface
{
public String sayHello()
{
return "Hello World!";
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
The above endpoint implements the following endpoint interface:
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
(
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing"
)
public interface ServiceIface
{
@WebMethod
String sayHello();
}
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
(
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing"
)
public interface ServiceIface
{
@WebMethod
String sayHello();
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Let's say that compiled endpoint and interface classes are located in directory /home/username/wsa/cxf/classes
. The next step is to generate the JAX-WS artifacts and WSDL that will be part of the endpoint archive.
Generating WSDL and JAX-WS Endpoint Artifacts
We will use the wsprovide
commandline tool to generate WSDL and JAX-WS artifacts. Here's the command:
cd JBOSS_HOME/bin
./wsprovide.sh --keep --wsdl \
--classpath=/home/username/wsa/cxf/classes \
--output=/home/username/wsa/cxf/wsprovide/generated/classes \
--resource=/home/username/wsa/cxf/wsprovide/generated/wsdl \
--source=/home/username/wsa/cxf/wsprovide/generated/src \
org.jboss.test.ws.jaxws.samples.wsa.ServiceImpl
cd JBOSS_HOME/bin
./wsprovide.sh --keep --wsdl \
--classpath=/home/username/wsa/cxf/classes \
--output=/home/username/wsa/cxf/wsprovide/generated/classes \
--resource=/home/username/wsa/cxf/wsprovide/generated/wsdl \
--source=/home/username/wsa/cxf/wsprovide/generated/src \
org.jboss.test.ws.jaxws.samples.wsa.ServiceImpl
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
The above command generates the following artifacts:
Compiled classes
SayHello.class
SayHelloResponse.class
Java Sources
SayHello.java
SayHelloResponse.java
Contract Artifacts
AddressingService.wsdl
All previously mentioned generated artifacts will be part of the endpoint archive, but before we create the endpoint archive, we need to reference generated WSDL from the endpoint. We will use the wsdlLocation
annotation attribute. This is the updated endpoint implementation before it is packaged to the war
file:
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebService;
@WebService
(
portName = "AddressingServicePort",
serviceName = "AddressingService",
wsdlLocation = "WEB-INF/wsdl/AddressingService.wsdl",
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
endpointInterface = "org.jboss.test.ws.jaxws.samples.wsa.ServiceIface"
)
public class ServiceImpl implements ServiceIface
{
public String sayHello()
{
return "Hello World!";
}
}
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebService;
@WebService
(
portName = "AddressingServicePort",
serviceName = "AddressingService",
wsdlLocation = "WEB-INF/wsdl/AddressingService.wsdl",
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
endpointInterface = "org.jboss.test.ws.jaxws.samples.wsa.ServiceIface"
)
public class ServiceImpl implements ServiceIface
{
public String sayHello()
{
return "Hello World!";
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
The created endpoint war archive consists of the following entries:
jar -tvf jaxws-samples-wsa.war
0 Mon Apr 21 20:39:30 CEST 2008 META-INF/
106 Mon Apr 21 20:39:28 CEST 2008 META-INF/MANIFEST.MF
0 Mon Apr 21 20:39:30 CEST 2008 WEB-INF/
593 Mon Apr 21 20:39:28 CEST 2008 WEB-INF/web.xml
0 Mon Apr 21 20:39:30 CEST 2008 WEB-INF/classes/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/
374 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/ServiceIface.class
954 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/ServiceImpl.class
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/jaxws/
703 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/jaxws/SayHello.class
1074 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/jaxws/SayHelloResponse.class
0 Mon Apr 21 20:39:30 CEST 2008 WEB-INF/wsdl/
2378 Mon Apr 21 20:39:28 CEST 2008 WEB-INF/wsdl/AddressingService.wsdl
jar -tvf jaxws-samples-wsa.war
0 Mon Apr 21 20:39:30 CEST 2008 META-INF/
106 Mon Apr 21 20:39:28 CEST 2008 META-INF/MANIFEST.MF
0 Mon Apr 21 20:39:30 CEST 2008 WEB-INF/
593 Mon Apr 21 20:39:28 CEST 2008 WEB-INF/web.xml
0 Mon Apr 21 20:39:30 CEST 2008 WEB-INF/classes/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/
374 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/ServiceIface.class
954 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/ServiceImpl.class
0 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/jaxws/
703 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/jaxws/SayHello.class
1074 Mon Apr 21 20:39:26 CEST 2008 WEB-INF/classes/org/jboss/test/ws/jaxws/samples/wsa/jaxws/SayHelloResponse.class
0 Mon Apr 21 20:39:30 CEST 2008 WEB-INF/wsdl/
2378 Mon Apr 21 20:39:28 CEST 2008 WEB-INF/wsdl/AddressingService.wsdl
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
The content of the web.xml
file is:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
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">
<servlet>
<servlet-name>AddressingService</servlet-name>
<servlet-class>org.jboss.test.ws.jaxws.samples.wsa.ServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddressingService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app
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">
<servlet>
<servlet-name>AddressingService</servlet-name>
<servlet-class>org.jboss.test.ws.jaxws.samples.wsa.ServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddressingService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Writing Regular JAX-WS Client
The following is the regular JAX-WS client using endpoint interface to lookup the webservice: package.org.jboss.test.ws.jaxws.samples.wsa:
package.org.jboss.test.ws.jaxws.samples.wsa:
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public final class SimpleServiceTestCase
{
private final String serviceURL = "http://localhost:8080/jaxws-samples-wsa/AddressingService";
public static void main(String[] args) throws Exception
{
// create service
QName serviceName = new QName("http://www.jboss.org/jbossws/ws-extensions/wsaddressing", "AddressingService");
URL wsdlURL = new URL(serviceURL + "?wsdl");
Service service = Service.create(wsdlURL, serviceName);
ServiceIface proxy = (ServiceIface)service.getPort(ServiceIface.class);
// invoke method
proxy.sayHello();
}
}
package.org.jboss.test.ws.jaxws.samples.wsa:
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public final class SimpleServiceTestCase
{
private final String serviceURL = "http://localhost:8080/jaxws-samples-wsa/AddressingService";
public static void main(String[] args) throws Exception
{
// create service
QName serviceName = new QName("http://www.jboss.org/jbossws/ws-extensions/wsaddressing", "AddressingService");
URL wsdlURL = new URL(serviceURL + "?wsdl");
Service service = Service.create(wsdlURL, serviceName);
ServiceIface proxy = (ServiceIface)service.getPort(ServiceIface.class);
// invoke method
proxy.sayHello();
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
We have both endpoint and client implementations but without WS-Addressing in place. Our next goal is to turn on the WS-Addressing feature.
There are two steps remaining in order to turn on WS-Addressing in JbossWS-CXF.
Updating Endpoint Code to Configure WS-Addressing
Now we need to update endpoint implementation to configure WS-Addressing. Here's the updated endpoint code:
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebService;
import javax.xml.ws.soap.Addressing;
@WebService
(
portName = "AddressingServicePort",
serviceName = "AddressingService",
wsdlLocation = "WEB-INF/wsdl/AddressingService.wsdl",
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
endpointInterface = "org.jboss.test.ws.jaxws.samples.wsa.ServiceIface"
)
@Addressing(enabled=true, required=true)
public class ServiceImpl implements ServiceIface
{
public String sayHello()
{
return "Hello World!";
}
}
package org.jboss.test.ws.jaxws.samples.wsa;
import javax.jws.WebService;
import javax.xml.ws.soap.Addressing;
@WebService
(
portName = "AddressingServicePort",
serviceName = "AddressingService",
wsdlLocation = "WEB-INF/wsdl/AddressingService.wsdl",
targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
endpointInterface = "org.jboss.test.ws.jaxws.samples.wsa.ServiceIface"
)
@Addressing(enabled=true, required=true)
public class ServiceImpl implements ServiceIface
{
public String sayHello()
{
return "Hello World!";
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
We have added the JAX-WS 2.1 Addressing annotation to configure WS-Addressing. The next step is to repackage the endpoint archive to apply this change.
Updating Client Code to Configure WS-Addressing
We need to update client implementation to configure WS-Addressing. Here's the updated client code:
package org.jboss.test.ws.jaxws.samples.wsa;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.AddressingFeature;
public final class AddressingTestCase
{
private final String serviceURL = "http://localhost:8080/jaxws-samples-wsa/AddressingService";
public static void main(String[] args) throws Exception
{
// construct proxy
QName serviceName = new QName("http://www.jboss.org/jbossws/ws-extensions/wsaddressing", "AddressingService");
URL wsdlURL = new URL(serviceURL + "?wsdl");
Service service = Service.create(wsdlURL, serviceName);
ServiceIface proxy = (ServiceIface)service.getPort(ServiceIface.class, new AddressingFeature());
// invoke method
proxy.sayHello();
}
}
package org.jboss.test.ws.jaxws.samples.wsa;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.AddressingFeature;
public final class AddressingTestCase
{
private final String serviceURL = "http://localhost:8080/jaxws-samples-wsa/AddressingService";
public static void main(String[] args) throws Exception
{
// construct proxy
QName serviceName = new QName("http://www.jboss.org/jbossws/ws-extensions/wsaddressing", "AddressingService");
URL wsdlURL = new URL(serviceURL + "?wsdl");
Service service = Service.create(wsdlURL, serviceName);
ServiceIface proxy = (ServiceIface)service.getPort(ServiceIface.class, new AddressingFeature());
// invoke method
proxy.sayHello();
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
We now have both JAX-WS client and endpoint communicating with each other using WS-Addressing.