This example will lead you through creating your first service with doing "code first" development with JAX-WS. You'll learn how to:
- Set up your build for CXF
- Writing a simple JAX-WS service
- Publish your service using the JAX-WS APIs
This example corresponds to the hello_world_code_first example in the CXF distribution. IMPORTANT: This sample is only in CXF 2.0.1+!
Setting up your build
Open up your favorite IDE and create a new project. The first thing we need to do is add the necessary CXF dependencies to the project. You can find these dependencies in the CXF distribution in the lib directory.
commons-logging-1.1.jar geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar) geronimo-annotation_1.0_spec-1.1.jar (JSR 250) geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar) geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar) geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181) jaxb-api-2.0.jar jaxb-impl-2.0.5.jar jaxws-api-2.0.jar jetty-6.1.5.jar jetty-util-6.1.5.jar neethi-2.0.jar saaj-api-1.3.jar saaj-impl-1.3.jar stax-api-1.0.1.jar wsdl4j-1.6.1.jar wstx-asl-3.2.1.jar XmlSchema-1.2.jar xml-resolver-1.2.jar
The Spring jars (optional - for XML Configuration support):
aopalliance-1.0.jar spring-core-2.0.4.jar spring-beans-2.0.4.jar spring-context-2.0.4.jar spring-web-2.0.4.jar
And the CXF jar:
cxf-2.0-incubator.jar
Writing your Service
First we'll write our service interface. It will have one operation called "sayHello" which says "Hello" to whoever submits their name.
To make sure your parameter is named correctly in the xml you should use:
@WebService public interface HelloWorld { String sayHi(@WebParam(name="text") String text); }
The @WebParam annotation is necessary as java interfaces do not store the Parameter name in the .class file. So if you leave out the annotation your parameter will be named arg0.
Our implementation will then look like this:
The @WebService annotation on the implementation class lets CXF know which interface we want to create our WSDL with. In this case its simply our HelloWorld interface.
Publishing your service
Alternatively you can use the follwing code. This gives you more control over the behaviour. For example you can add a logging interceptor:
HelloWorldImpl implementor = new HelloWorldImpl(); JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean(); svrFactory.setServiceClass(HelloWorld.class); svrFactory.setAddress("http://localhost:9000/helloWorld"); svrFactory.setServiceBean(implementor); svrFactory.getInInterceptors().add(new LoggingInInterceptor()); svrFactory.getOutInterceptors().add(new LoggingInInterceptor()); svrFactory.create();
You could leave out the ServiceClass. But it is better to use it so the server and the client are created from the same interface. If you instead only use the implementation class subtle problems may occur.
Pointing your browser at http://localhost:9000/helloWorld?wsdl will display the wsdl for this service
and client code to see it working is at http://svn.apache.org/repos/asf/incubator/cxf/trunk/distribution/src/main/release/samples/java_first_jaxws/src/demo/hw/client/Client.java