Apache CXF – JAX-WS – Simple Tutorial
A lot of Java Developers out there sees task with Web Service implementation daunting – well, nobody can blame them really, especially that it brings a lot of complexity in development and design over the years of enterprise application development. For some though, learning it is somehow the next step in building a full blown enterprise application – Web Services – is one of the key schemes for implementing service oriented design – almost every platform available has support to the scheme, and that of course includes Java/J2EE.
In this tutorial, I will show how you will using Apache CXF to create Web Servies using JAX-WS and the Apache CXF API to call specific service from a remote application.
- Building the Web Service Application : Server Side – We need to build the application as well as the Web Services implementation code. This will be a generic WAR (Web Archive) that will house the actual implementation
- Building the Web Service Application: Client Side – Of course, we need to provide external clients a way for them to access the services – we will create a stub and give them out to clients for them to use the services.
FYI: I’m using Maven to simplify library definitions.
1st we create the Stub
this houses the interface and entities (Pojos) used to access the service. When you design your service – you usually create the class interfaces (reference) first and put it on another JAR file for re-distribution.
2nd lets build the service.
We will be hosting the service from a Web Archive deployed to an application server.
POM. xml – We will be using Spring CDI and CXF – Might as well load up all the libraries needed.
We include the stub on the server as this will act as the reference of our implementation:
We now create the Service Implementation:
cxf-servlet (or beans.xml) – this is where we will call the factory that will publish the WSDL upon loading the context.
web.xml – we need to make sure that web service request will go thru CXF – since we are using its framework. Good thing about CXF is it does all the necessary binding, marshalling, unmarshalling as well as injecting the in / out interceptors.
Build and Deploy the WAR! – After deploying the war, view the context page. You should be seeing something like this:
If you manage to view the above URL – then you have successfully expose your service and can now be called by external clients
3rd we create the client app.
Now we create a standalone Java app to call the service – we will be using Spring again to context load client beans and we need include the stub so that we can have reference to the implementation.
beans.xml – create the xml and call the proxy factory bean to create the instance on runtime
Create the Client – We will now call the bean and use the reference to call the method.
4th Test! – Test your service!
You should now be able call the Service implementation!
Download the example here
With this simple example, its really a conclusive proof that creating Web Service now is just a breeze – We took advantage of Apache CXF as a service framework to simplify the development and Springs powerful CDI that almost took care the rest.
It is simple. But developers should be aware that it’s not always ideal, because in samples like this one the Java code determines the Web Service’s WSDL contract (often called a contract-last approach) which can introduce coupling issues for service consumers.
In SOA, contract-first (where the code is shaped by the WSDL no the other way round) is considered the better approach to creating enterprise web services but it is more complicated. However, JAX-WS and CXF both support this method, and its the only method supported by Spring. See http://static.springsource.org/spring-ws/sites/2.0/reference/html/why-contract-first.html for more.
Hope this helps.
Why don’t I see the cxf.xml, cxf-extension-http.xml and cxf-extension-soap.xml files in the downloadable zip?
javax.xml.ws.WebServiceException: Could not find wsdl:binding operation info for web method XXXX.
at com.sun.proxy.$Proxy82.getUser(Unknown Source)
If this error occurred then, add annotation Webservice to your client side interface which is already developed on service side.
I faced this issue,I have configured Spring with CXF. I have already developed the service and calling it from client.
Hope this will help.
Source code is not available in the dropbox link provided, getting http 404