Orchestrate JAX-WS Web services with JBoss Fuse
In this tutorial we will learn how to install a Camel blueprint project on JBoss Fuse and orchestrate a CXF Web service which is published on WildFly application server.
The starting point for this tutorial is a simple HelloWorld Web service. Here is the implementation class:
@WebService(endpointInterface = "demows.HelloWorld",
targetNamespace = "http://hello.world.ns/",
name = "HelloWorld",
serviceName = "HelloWorldService",
portName = "HelloWorldPort")
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL)
public class HelloWorldImpl implements HelloWorld {
public String sayHi(String text) {
System.out.println(text);
return "Hello " + text;
}
public String greetings(Person person) {
System.out.println(person);
return "Greetings " + person.getName() + " " + person.getSurname();
}
}
The implementation class is deployed on WildFly application server and the WSDL is available at: http://localhost:8080/demows/HelloWorldService?wsd
Creating the BluePrint project
Now we will create a Camel blue print project. If you are running in JBoss Developer studio, choose New Fuse Project and select the camel-archetype-blueprint:

Now let’s code the blueprint.xml file. The first attempt will be invoking the sayHi method which received as input a String. This will be pretty easy as we just need:
- A CXF Endpoint declaration
- Setting the Body with the value of the String
- Something to trigger the execution of the route, such as a one-shot Timer
Here is the blueprint.xml which does it:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<cxf:cxfEndpoint id="SimpleWebSevice"
address="http://localhost:8080/demows/HelloWorldService" wsdlURL="http://localhost:8080/demows/HelloWorldService?wsdl"
serviceClass="demows.HelloWorldImpl" />
<camelContext trace="true" id="cbr-example-context"
xmlns="http://camel.apache.org/schema/blueprint" xmlns:order="http://fusesource.com/examples/order/v7">
<route id="wsClient">
<from uri="timer:foo?repeatCount=1" />
<setBody>
<simple>Helloworld</simple>
</setBody>
<log message="${body}" />
<to uri="cxf:bean:SimpleWebSevice?defaultOperationName=sayHi" />
<to uri="mock:result" />
</route>
</camelContext>
</blueprint>
You can publish directly the project from JBoss Developer Studio by adding a Fuse Server. If you don’t have JBoss Developer Studio, from the shell build the project at first:
mvn clean install
then from the Karaf console execute:
JBossFuse:karaf@root> osgi:install -s mvn:com.mycompany/jaxws-fuse-demo/1.0.0-SNAPSHOT
The project should be deployed. Check on the Karaf console that the osgi has been installed:
JBossFuse:karaf@root> osgi:list
You should find something like this at the end of the list:
[ 271] [Active ] [Created ] [ ] [ 60] A Camel CXF Blueprint Route (1.0.0.SNAPSHOT)
On the WildFly application server console you should expect to find a log of the Web service call:

Passing Objects from the Camel Route
And now with the more complex example: we will pass a Person object to the Camel route. For this purpose we will add a simple PersonFactory class that will grab the body and construct a Person from it. To keep it pretty simple I’ve used a StringTokenizer:
package demows;
import java.util.StringTokenizer;
public class PersonFactory {
public Person createPerson(String body){
StringTokenizer st = new StringTokenizer(body,":");
System.out.println("Going to create Person "+body);
Person person = new Person();
person.setName(st.nextToken());
person.setSurname(st.nextToken());
return person;
}
public PersonFactory() { }
}
Now we need to vary a little bit our blueprint so that the PersonFactory class is defined and used to generate a Person object:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<cxf:cxfEndpoint id="SimpleWebSevice"
address="http://localhost:8080/demows/HelloWorldService" wsdlURL="http://localhost:8080/demows/HelloWorldService?wsdl"
serviceClass="demows.HelloWorldImpl" />
<bean id="personFactory" class="demows.PersonFactory" />
<camelContext trace="true" id="cbr-example-context"
xmlns="http://camel.apache.org/schema/blueprint" xmlns:order="http://fusesource.com/examples/order/v7">
<route id="wsClient">
<from uri="timer:foo?repeatCount=1" />
<setBody>
<simple>john:doe</simple>
</setBody>
<bean ref="personFactory" method="createPerson" />
<log message="${body}" />
<to uri="cxf:bean:SimpleWebSevice?defaultOperationName=greetings" />
<to uri="mock:result" />
</route>
</camelContext>
</blueprint>
Now redeploy the project from JBoss developer studio. If you are using just the shell uninstall the previous bundle
JBossFuse:karaf@root> osgi:uninstall [bundleid]
Then re-install it:
JBossFuse:karaf@root> osgi:install -s mvn:com.mycompany/jaxws-fuse-demo/1.0.0-SNAPSHOT
Now check from the hawtio console to see your Camel route in action (http://localhost:8181):

As you can see, all the route steps have been correctly executed. You should find as well a log on the application server console informing you that the Web service has been invoked. Have fun with JBoss Fuse and Web services!
Recommended Articles
How to develop CXF Web services with JBoss / WildFly
Learn how to develop, deploy, and secure SOAP Web Services on WildFly 41.0.1.Final using Jakarta EE 11 and Apache CXF. Master JAX-WS handlers, CXF interceptors, and robust cloud configurations.
Deploying SOAP Web Services in Jakarta EE Applications: A Step-by-Step Guide
Learn how to build and deploy SOAP-based web services in Jakarta EE applications, including guidance on the changes in Java SE that removed the JAX-WS API.
Developing SOAP Web Services on WildFly 41 (Jakarta EE 11) with Apache CXF
Learn how to develop, deploy, and secure Jakarta XML Web Services (SOAP) on WildFly 41.0.1.Final and Jakarta EE 11 using Apache CXF, WS-Security, and modern testing tools.
Disable JAX-WS SOAP Web Services on WildFly Application Server - Comprehensive Guide
Learn how to disable JAX-WS SOAP Web Services at both application and subsystem levels in WildFly. #WildFly #Java #Middleware