Hey all, I have a route that produces a CXF Endpoint.
public class FooRoute extends RouteBuilder { private String uri = "cxf:/foo?serviceClass=" + FooService.class.getName(); @Override public void configure() throws Exception { from(uri) .to("log:input") // send the request to the route to handle the operation // the name of the operation is in that header .recipientList(simple("direct:${header.operationName}")); from("direct:findById") .process(new Processor() { public void process(Exchange exchange) throws Exception { // get the id from the input String id = exchange.getIn().getBody(FooRequest.class).getId(); exchange.getOut().setBody(id); } }) .to("sql:select value from table where id = #?dataSource=ds") .to("log:output") .process(new Processor() { public void process(Exchange exchange) throws Exception { // get the value from the input List<HashMap> data = (ArrayList<HashMap>) exchange.getIn().getBody(); // todo: handle value is empty FooResponse response = new FooResponse(); response.setGpi(String.valueOf(data.get(0).get("value"))); exchange.getOut().setBody(response); } }).end(); } } This is easy to talk to thanks to CXF's ClientFactoryBean, allowing me to call methods directly on the interface. protected static FooService createCXFClient() { // we use CXF to create a client for us as its easier than JAXWS and works ClientProxyFactoryBean factory = new ClientProxyFactoryBean(); factory.setServiceClass(FooService.class); factory.setAddress(URL); return (FooService) factory.create(); } One of the things I'd like to do is make this new service backwards-compatible with the old one. In other words, I should be able to change the endpoint URL in the existing client and everything works the same. The existing client uses the javax.xml.soap API to talk to the service. Below is a test I wrote that shows how it works. Is it possible to modify my route/endpoint so this WS call will work? SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); SOAPMessage message = MessageFactory.newInstance("SOAP 1.2 Protocol").createMessage(); SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); envelope.addNamespaceDeclaration("soap", "http://www.w3.org/2003/05/soap-envelope"); envelope.addNamespaceDeclaration("ax22", "http://common.app.company.com/xsd"); SOAPBody body = envelope.getBody(); body.addNamespaceDeclaration("m", "http://ws.app.company.com"); ByteArrayOutputStream request = new ByteArrayOutputStream(); message.writeTo(request); SOAPElement bodyChildOne = body.addChildElement("CompanyFooRequest", "m"); SOAPElement bodyChildTwo = bodyChildOne.addChildElement("args0", "m"); bodyChildTwo.addChildElement("ID", "ax22").addTextNode("123456"); SOAPMessage reply = connection.call(message, "http://localhost:7800/axis2/services/CompanyFooService_2_0"); if (reply != null) { Iterator itr = reply.getSOAPBody().getChildElements(); Map resultMap = TestUtils.getResults(itr); // TestUtils loops through SOAPElements to create a map assertEquals("6610012", resultMap.get("value")); } Thanks, Matt