...
This WSDL also defines a binding, Greeter_SOAPBinding
, for the SOAP protocol. In practice, the binding is normally generated
automatically - for example, by running either of the CXF wsdl2soap or wsdl2xml utilities. Likewise, the SOAPService
service can be generated automatically by running the CXF wsdl2service utility.
...
Where ClientDir is the location of a directory where you would like to put the generated files and hello_world.wsdl
is a file containing the contract shown in the WSDL above. The -ant
option generates an ant build.xml
file, for use with the ant build utility. The -client
option generates starting point code for a client main()
method.
...
- Classes representing WSDL entities (in the
org.apache.hello_world_soap_http
package) - the following classes are generated to represent WSDL entities:Greeter
is a Java interface that represents the Greeter WSDL port type. In JAX-WS terminology, this Java interface is a service endpoint interface.SOAPService
is a Java class that represents the SOAPService WSDLservice
element.PingMeFault
is a Java exception class (extendingjava.lang.Exception
) that represents the pingMeFault WSDLfault
element.
- Classes representing XML types (in the
org.apache.hello_world_soap_http.types
package) - in the HelloWorld example, the only generated types are the various wrappers for the request and reply messages. Some of these data types are useful for the
asynchronous invocation model.
...
Code Block | ||
---|---|---|
| ||
public class ServiceName extends javax.xml.ws.Service { ... public ServiceName(URL wsdlLocation, QName serviceName) { } public ServiceName() { } public Greeter getPortName() { } . . . } |
...
Code Block | ||
---|---|---|
| ||
/* Generated by WSDLToJava Compiler. */ package org.objectweb.hello_world_soap_http; ... public interface Greeter { public java.lang.String sayHi(); public java.lang.String greetMe(java.lang.String requestType); public void greetMeOneWay(java.lang.String requestType); public void pingMe() throws PingMeFault; } |
...
Code Block | ||
---|---|---|
| ||
package demo.hw.client; import java.io.File; import java.net.URL; import javax.xml.namespace.QName; import org.apache.hello_world_soap_http.Greeter; import org.apache.hello_world_soap_http.PingMeFault; import org.apche.hello_world_soap_http.SOAPService; public final class Client { private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_soap_http", "SOAPService"); private Client() { } public static void main(String args[]) throws Exception { if (args.length == 0) { System.out.println("please specify wsdl"); System.exit(1); } URL wsdlURL; File wsdlFile = new File(args[0]); if (wsdlFile.exists()) { wsdlURL = wsdlFile.toURL(); } else { wsdlURL = new URL(args[0]); } System.out.println(wsdlURL); SOAPService ss = new SOAPService(wsdlURL, SERVICE_NAME); Greeter port = ss.getSoapPort(); String resp; System.out.println("Invoking sayHi..."); resp = port.sayHi(); System.out.println("Server responded with: " + resp); System.out.println(); System.out.println("Invoking greetMe..."); resp = port.greetMe(System.getProperty("user.name")); System.out.println("Server responded with: " + resp); System.out.println(); System.out.println("Invoking greetMeOneWay..."); port.greetMeOneWay(System.getProperty("user.name")); System.out.println("No response from server as method is OneWay"); System.out.println(); try { System.out.println("Invoking pingMe, expecting exception..."); port.pingMe(); } catch (PingMeFault ex) { System.out.println("Expected exception: PingMeFault has occurred."); System.out.println(ex.toString()); } System.exit(0); } } |
...
For example, if you want to generate asynchronous methods only for the GreeterAsync
port type, you could specify <bindings node="wsdl:definitions/wsdl:portType@name='GreeterAsync'">
in the preceding binding declaration.
...
The below sample illustrates the polling approach to making an asynchronous operation call. Using this approach, the client invokes the
operation by calling the special Java method, _OperationName_Async()
, that returns a javax.xml.ws.Response<T>
object, where T is the type of the operation's response message. The Response<T>
object can be polled at a later stage to check whether the operation's response message has arrived.
...
Code Block | ||
---|---|---|
| ||
package demo.hw.client;
import java.io.File;
import java.util.concurrent.Future;
import javax.xml.namespace.QName;
import javax.xml.ws.Response;
import org.apache.hello_world_async_soap_http.GreeterAsync;
import org.apache.hello_world_async_soap_http.SOAPService;
import org.apche.hello_world_async_soap_http.types.GreetMeSometimeResponse;
public final class Client {
private static final QName SERVICE_NAME
= new QName("http://objectweb.org/hello_world_async_soap_http",
"SOAPService");
private Client() {}
public static void main(String args[]) throws Exception {
...
// Polling approach:
Response<GreetMeSometimeResponse> greetMeSomeTimeResp =
port.greetMeSometimeAsync(System.getProperty("user.name"));
while (!greetMeSomeTimeResp.isDone()) {
Thread.sleep(100);
}
GreetMeSometimeResponse reply = greetMeSomeTimeResp.get();
...
System.exit(0);
}
}
|
...
An alternative approach to making an asynchronous operation invocation is to implement a callback class, by deriving from the javax.xml.ws.AsyncHandler
interface. This callback class must implement a handleResponse()
method, which is called by the CXF runtime to notify the client that the response has arrived. The following shows an outline of the AsyncHandler
interface that you need to implement.
...