Tuesday, May 10, 2011

Spring web services using Apache CXF

This blog illustrates how to configure and develop a web service and client using Apache CXF.

Step 1
Download and Install JDK 1.6, Maven and your favorite web application container(tomcat,jboss,glassfish).

Step 2
Create a maven application with archetype "maven-archetype-webapp". Ask Google if you need help running this archetype.

Step 3
Add maven repository for JBoss and dependencies for junit and Apache CXF.

pom.xml
        .
        .
    <repositories>
        <repository>
            <id>jboss-public-repository-group</id>
            <name>JBoss Public Maven Repository Group</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <properties>
        <cxf.version>2.4.0</cxf.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
    </dependencies>
        .
        .

Step 4
Develop the webservice interface and class using JAX-WS annotations.

CalculatorService.java
@WebService
public interface CalculatorService {
    double addNumbers(double a, double b);

    double subtractNumbers(double a, double b);
}

CalculatorServiceImpl.java
@WebService(endpointInterface = "com.ingeniouscamel.springcxfws.service.CalculatorService", 
                        serviceName = "calculatorService")
public class CalculatorServiceImpl implements CalculatorService {
    public double addNumbers(double a, double b) {
        return a + b;
    }

    public double subtractNumbers(double a, double b) {
        return a - b;
    }
}

Step 5
Configure spring context loader and Apache's CXF Servlet in web.xml.

web.xml
       .
       .
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>cxfws-servlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxfws-servlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
       .
       .

Step 6
Configure calculator service endpoint in spring's context by specifying service class and URL.

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://cxf.apache.org/jaxws 
        http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    
    <jaxws:endpoint id="calculatorService"
        implementor="com.ingeniouscamel.springcxfws.service.CalculatorServiceImpl"
        address="/calculator"/>
</beans>

Step 7
Run the application in your webapp container and test it using the following URL

http://localhost:<Port>/<WebAppContext>/services/calculator?WSDL



Step 8
Configure Apache CXF's JaxWsProxyFactoryBean class to return a service interface to our webservice and call methods on the web service directly.

CalculatorWebServiceClientTest.java
public class CalculatorWebServiceClientTest {
    private CalculatorService calculatorWebService;

    @Before
    public void setUp() throws Exception {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(CalculatorService.class);
        factory.setAddress("http://localhost:8080/SpringCxfWSApp/services/calculator");
        calculatorWebService = (CalculatorService) factory.create();
    }

    @Test
    public void testAddNumbers() {
        Assert.isTrue(calculatorWebService.addNumbers(3, 5) == 8);
    }

    @Test
    public void testSubtractNumbers() {
        Assert.isTrue(calculatorWebService.subtractNumbers(7, 4) == 3);
    }
}

Download Project
You can download my project from google code. SVN URL is http://ingenious-camel.googlecode.com/svn/trunk/SpringCxfWSApp/

No comments:

Post a Comment