...
The camel-cxf endpoint consumer POJO data format is based on the cxf invoker, so the message header has a property with the name of CxfConstants.OPERATION_NAME and the message body is a list of the SEI method parameters.
Wiki Markup | ||
---|---|---|
{snippet:id=personProcessor|lang=java|url=activemq/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonProcessor.java} | ||
Code Block | ||
java | java |
from(SIMPLE_ENDPOINT_URI).process(new Processor() {
public void process(final Exchange exchange) {
Message request = exchange.getIn();
// Get the parameter list
List parameter = in.getBody(List.class);
// Get the operation name
String operation = (String)in.getHeader(CxfConstants.OPERATION_NAME);
Object result = null;
if (operation.equals(ECHO_OPERATION)) {
result = operation + " " + (String)parameter.get(0);
}
// Put the result back
exchange.getOut().setBody(result);
}
});
|
How to prepare the message for the camel-cxf endpoint in POJO data format
The camel-cxf endpoint producer is based on the cxf client API. First you need to specify the operation name in the message header , then add the method parameters into a list and set the message with this parameter list will be ok. The response message's body is an object array, you can get the result from that array.
Wiki Markup | ||
---|---|---|
{snippet:id=sending|lang=java|url=activemq/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfProducerRouterTest.java} | ||
Code Block | ||
java | java |
CxfExchange exchange = (CxfExchange)template.send(getJaxwsEndpointUri(), new Processor() {
public void process(final Exchange exchange) {
final List<String> params = new ArrayList<String>();
params.add(TEST_MESSAGE);
exchange.getIn().setBody(params);
exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
}
});
org.apache.camel.Message out = exchange.getOut();
Object[] output = (Object[])out.getBody();
LOG.info("Received output text: " + output[0]);
assertEquals("reply body on Camel", "Hello " + TEST_MESSAGE, output[0]);
|
How to propagate camel-cxf endpoint's request and response context
...
Code Block | ||||
---|---|---|---|---|
| ||||
CxfExchange exchange = (CxfExchange)template.send(getJaxwsEndpointUri(), new Processor() {
public void process(final Exchange exchange) {
final List<String> params = new ArrayList<String>();
params.add(TEST_MESSAGE);
// Set the request context to the inMessage
Map<String, Object> requestContext = new HashMap<String, Object>();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, JAXWS_SERVER_ADDRESS);
exchange.getIn().setBody(params);
exchange.getIn().setHeader(Client.REQUEST_CONTEXT , requestContext);
exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
}
});
org.apache.camel.Message out = exchange.getOut();
// The output is an object array, the fist element of the array is the return value
Object[] output = (Object[])out.getBody();
LOG.info("Received output text: " + output[0]);
// Get the response context form outMessage
Map<String, Object> responseContext = CastUtils.cast((Map)out.getHeader(Client.RESPONSE_CONTEXT));
assertNotNull(responseContext);
assertEquals("Get the wrong wsdl opertion name", "{http://apache.org/hello_world_soap_http}greetMe", responseContext.get("javax.xml.ws.wsdl.operation").toString());
|
...