Camel CXF POJO mode using Java DSL
apache-camel, cxf, soap
Solution
In my experience there are some things in Camel, like calling a SOAP Web service or making a REST call, that are easier to do in a custom processor, than using a component like CXF, HTTP or HTTP4.
I usually work with Spring, so I tend to use either Spring REST template or the JaxWsPortProxyFactoryBean (for Webservice calls) for outbound calls.
Here is an example using a JAX-WS call:
public class WebServiceProcessorBean {
@Autowired
private JAXWSProxy theProxy;
public void callWebservice(Exchange exchange) {
Response response = theProxy.call();
//Do something with the response and Exchange.
}
}
The definition in the Spring application context:
<bean id="theProxyService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
<property name="serviceInterface" value="XXX"/>
<property name="wsdlDocumentUrl" value="http://xxxxx.wsdl"/>
<property name="namespaceUri" value="xxxx"/>
<property name="serviceName" value="xxxx"/>
<property name="portName" value="xxxxx"/>
</bean>
Use the WebServiceProcessorBean defined in Spring application context with beanRef() DSL method.
.beanRef("theProxyService", "callWebservice")
Problem
I have a pre-existing web service "connect" (SOAP) I would like to call without using the Swing framework if possible. I have followed the contact first development generating my java files using cxf/wsdl2java tool. I wish for the userName and password to be extracted from the java object and placed in a SOAP object then sent onot my localhost web service. When sending the Connect object as a body to the "direct:start" I get an exception... ``` Caused by: java.lang.IllegalArgumentException: Get the wrong parameter size to invoke the out service, Expect size 2, Parameter size 1. Please check if the message body matches the CXFEndpoint POJO Dataformat request. ``` I've checked the first argument is actually an instance of the Connect object passed in. Do I need some additional annotations in the one of the classes, is the method of testing invalid or is there an alternative pattern I should follow? ``` public class TestConnectCXF extends CamelTestSupport { @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { String cxfAddressLine = "cxf:http://localhost:8081/nuxeo/webservices/privateadservice?wsdlURL=wsdl/privateadservice.wsdl" // + "&dataFormat=POJO" // + "&serviceClass=com.sandbox.camelfeed.PrivateAdServiceInterface" // + "&serviceName={http://ws.sandboxtest.com/}PrivateAdService" // + "&synchronous=true" // + "&loggingFeatureEnabled=true" // + "&portName={http://ws.sandboxtest.com/}PrivateAdServiceInterfacePort"; @Override public void configure() throws Exception { from("direct:start").to(cxfAddressLine).to("mock:end"); } }; } @Test public void testConnectViaPojo() throws InterruptedException { Connect connectToServer = new Connect(); connectToServer.setUserName("FakeUser"); connectToServer.setPassword("scrubbed"); template.sendBody("direct:start", connectToServer); Thread.sleep(1000); } } ``` I'm new to camel and web services so any helpful pointers would be greatly appreciated. Additional info Using camel 2.10, Java 1.6 Classes generated from wsdl2java ``` @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "connect", propOrder = { "userName", "password" }) public class Connect { protected String userName; protected String password; public String getUserName() { return userName; } public void setUserName(String value) { this.userName = value; } public String getPassword() { return password; } public void setPassword(String value) { this.password = value; } } @WebService(targetNamespace = "http://ws.sandboxtest.com/", name = "PrivateAdServiceInterface") @XmlSeeAlso({ObjectFactory.class}) public interface PrivateAdServiceInterface { // Omitted Code relating to other web calls @WebResult(name = "return", targetNamespace = "") @RequestWrapper(localName = "connect", targetNamespace = "http://ws.sandboxtest.com/", className = "com.sandbox.camelfeed.Connect") @WebMethod @ResponseWrapper(localName = "connectResponse", targetNamespace = "http://ws.sandboxtest.com/", className = "com.sandbox.camelfeed.ConnectResponse") public java.lang.String connect( @WebParam(name = "userName", targetNamespace = "") java.lang.String userName, @WebParam(name = "password", targetNamespace = "") java.lang.String password ) throws ClientException_Exception; } @XmlRegistry public class ObjectFactory { { // Omitted other web calls information private final static QName _Connect_QNAME = new QName("http://ws.sandboxtest.com/", "connect"); @XmlElementDecl(namespace = "http://ws.sandboxtest.com/", name = "connect") public JAXBElement<Connect> createConnect(Connect value) { return new JAXBElement<Connect>(_Connect_QNAME, Connect.class, null, value); } } ```