# JAX-WS Client Development Options

## WSDL2Java generated Client

One of the most common scenarios is that where you have a service which you may or not manage and this service has a WSDL. In this case you'll often want to generate a client from the WSDL. This provides you with a strongly typed interface by which to interact with the service. Once you've generated a client, typical usage of it will look like so:

```
HelloService service = new HelloService();
            Hello client = service.getHelloHttpPort();
            String result = client.sayHi("Joe");
```

The WSDL2Java tool will generate JAX-WS clients from your WSDL. You can run WSDL2java one of three ways:

* [The](http://cxf.apache.org/docs/wsdl-to-java.html) command line

* [The](http://cxf.apache.org/docs/using-cxf-with-maven.html#UsingCXFwithmaven-MavenPlugin) Maven Plugin

* With the WSDL2Java API

For more in depth information read [Developing](http://cxf.apache.org/docs/developing-a-consumer.html) a JAX-WS consumer or see the Hello World demos inside the distribution.

## JAX-WS Proxy

Instead of using a wsdl2java-generated stub client directly, you can use Service.create to create Service instances, the following code illustrates this process:

```
import java.net.URL;
            import javax.xml.ws.Service;
            ...
            
            URL wsdlURL = new URL("http://localhost/hello?wsdl");
            QName SERVICE_NAME = new QName("http://apache.org/hello_world_soap_http", 
            "SOAPService");
            Service service = Service.create(wsdlURL, SERVICE_NAME);
            Greeter client = service.getPort(Greeter.class);
            String result = client.greetMe("test");
```

## JAX-WS Dispatch APIs

JAX-WS provides the "dispatch" mechanism which makes it easy to dynamically invoke services which you have not generated a client for. Using the Dispatch mechanism you can create messages (which can be JAXB objects, Source objects, or a SAAJMessage) and dispatch them to the server. A simple example might look like this:

```
import java.net.URL;
            import javax.xml.transform.Source;
            import javax.xml.ws.Dispatch;
            import javax.xml.ws.Service;
            ...
            
            URL wsdlURL = new URL("http://localhost/hello?wsdl");
            Service service = Service.create(wsdlURL, new QName("HelloService"));
            Dispatch<Source> disp = service.createDispatch(new QName("HelloPort"),
            Source.class, Service.Mode.PAYLOAD);
            
            Source request = new StreamSource("<hello/>")
            Source response = disp.invoke(request);
```

NOTE: you can also use dispatches without a WSDL.

For more in depth information see the Hello World demos inside the distribution.

### In this section

* [Usage Modes](https://help.qlik.com/talend/en-US/esb-service-developer-guide/8.0/usage-modes)
* [Data Types of JAX-WS Dispatch](https://help.qlik.com/talend/en-US/esb-service-developer-guide/8.0/data-types-of-jax-ws-dispatch)
* [Working with Dispatch Objects](https://help.qlik.com/talend/en-US/esb-service-developer-guide/8.0/working-with-dispatch-objects)
* [Developing a Consumer](https://help.qlik.com/talend/en-US/esb-service-developer-guide/8.0/developing-consumer)