Description
The Wsclient plugin adds a remoting client capable of communicating via SOAP. It is compatible with Grails' Xfire plugin 0.8.1.
Installation
The current version of griffon-wsclient-plugin is 0.1
To install just issue the following command
griffon install-plugin wsclient
Usage
The plugin will inject the following dynamic methods:
- withWs(Map params, Closure stmts) - executes stmts issuing SOAP calls to a remote server.
Where params may contain
| Property | Type | Required | Notes |
|---|---|---|---|
| wsdl | String | |
WSDL location |
| soapVersion | String | |
either "1.1" or "1.2". Defaults to "1.1" |
| classLoader | ClassLoader | |
classLoader used for proxy classes |
| timeout | long | |
|
| mtom | boolean | |
enable mtom |
| basicAuth | Map | |
must define values for username and password keys |
| proxy | Map | |
proxy settings. Keys must match groovyx.net.ws.cxf.SettingsConstants |
| ssl | Map | |
ssl settings, Keys must match groovyx.net.ws.cxf.SettingsConstants |
/** Http proxy user */
public static final String HTTP_PROXY_USER = "http.proxy.user";
/** Http proxy password */
public static final String HTTP_PROXY_PASSWORD = "http.proxy.password";
/** Http proxy host */
public static final String HTTP_PROXY_HOST = "http.proxyHost";
/** Http proxy port */
public static final String HTTP_PROXY_PORT = "http.proxyPort";
/** SSL truststore */
public static final String HTTPS_TRUSTSTORE = "https.truststore";
/** SSL truststore password */
public static final String HTTPS_TRUSTSTORE_PASS = "https.truststore.pass";
/** SSL keystore */
public static final String HTTPS_KEYSTORE = "https.keystore";
/** SSL keystore password */
public static final String HTTPS_KEYSTORE_PASS = "https.keystore.pass";
/** Http basic authentication user */
public static final String HTTP_USER = "http.user";
/** Http basic authentication password */
public static final String HTTP_PASSWORD = "http.password";
Examples
This example relies on Grails as the service provider. Follow these steps to configure the service on the Grails side:
- Download a copy of Grails and install it.
- Create a new Grails application. We'll pick 'exporter' as the application name.
grails create-app exporter
- Change into the application's directory. Install the xfire plugin.
grails install-plugin xfire
- Create a MathService
grails create-service MathService
grails-app/services/MathService.groovyclass MathService { boolean transactional = false static expose = ["xfire"] double add(double arg0, double arg1){ println "add($arg0, $arg1)" // good old println() for quick debugging return arg0 + arg1 } } - Start the application
grails run-app
Now we're ready to build the Griffon application
- Create a new Griffon application. We'll pick MathClient as the name
griffon create-app mathClient
- Install the wsclient plugin
griffon install-plugin wsclient
- Fix the view script to look like this
griffon-app/views/MathClientView.groovy
application(title: 'Wsclient Plugin Example', pack: true, locationByPlatform: true, iconImage: imageIcon('/griffon-icon-48x48.png').image, iconImages: [imageIcon('/griffon-icon-48x48.png').image, imageIcon('/griffon-icon-32x32.png').image, imageIcon('/griffon-icon-16x16.png').image]) { gridLayout(cols: 2, rows: 4) label("Num1:") textField(columns: 20, text: bind(target: model, targetProperty: "num1")) label("Num2:") textField(columns: 20, text: bind(target: model, targetProperty: "num2")) label("Result:") label(text: bind{model.result}) button("Calculate", enabled: bind{model.enabled}, actionPerformed: controller.calculate) }
- Let's add required properties to the model
griffon-app/models/MathClientModel.groovy
import groovy.beans.Bindable class MathClientModel { @Bindable String num1 @Bindable String num2 @Bindable String result @Bindable boolean enabled = true }
- Now for the controller code. Notice that there is minimal error handling in place. If the user types something that is not a number the client will surely break, but the code is sufficient for now.
griffon-app/controllers/MathClientController.groovy
class MathClientController { def model def calculate = { evt = null -> double a = model.num1.toDouble() double b = model.num2.toDouble() model.enabled = false doOutside { try { def result = withWs(wsdl: "http://localhost:8080/exporter/services/math?wsdl") { add(a, b) } doLater { model.result = result.toString() } } finally { model.enabled = true } } } } - Start the application
griffon run-app
All dynamic methods will create a new client when invoked unless you define an id: attribute. When this attribute is supplied the client will be stored as a property on the instance's metaClass. You will be able to access it via regular property access or using the id: again.


