Here's a horribly hacked together bit of code that send some XML to my service and does something with the result. This code was put together purely to check that the stuff in the post above deployed with Spring WS was doing its thing...
My next job is to go look at jaxws stuff and try to move away from hacky client code like this 
Code:
public class TestClient extends TestCase {
protected final Log logger = LogFactory.getLog(getClass());
public void testClient()
{
logger.info("Starting test");
String hardXML = "<event> .. SNIP .. </event>";
Event event = null;
Tree tree = null;
try {
// Using HttpURLConnection to talk to web service.
// We pass the event xml and expect to get back an xml representation
// of a Tree object (containing drilldown data).
URL url = new URL("http","localhost",8080,"/WS/test");
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setDoOutput (true);
httpConnection.setDoInput(true);
httpConnection.setRequestMethod ("POST");
httpConnection.setRequestProperty("Content-Type", "text/xml");
httpConnection.setUseCaches(false);
OutputStream os = httpConnection.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(os);
ow.write(hardXML);
ow.flush();
ow.close();
// Read the response...
// In this case it will be an xml representation of a Tree
BufferedReader in = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
String input;
StringBuffer response = new StringBuffer(256);
while((input = in.readLine()) != null) {
response.append(input + "\r");
}
httpConnection.disconnect();
// Throws the XML at Jaxb...
ObjectFactory of = new ObjectFactory();
tree = of.getTree(response.toString());
assertNotNull("Got Tree object from XML",tree);
// log something from the object to prove it is populated.....
List<DrilldownTree> dds = tree.getDrilldownTree();
DrilldownTree dd = dds.get(0);
logger.debug("got tree: " + dd.getDdTypeName());
} catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
}