ApacheCXF
Apache CXF is an open source services framework. CXF helps you build and develop services using frontend programming APIs, like JAX-WS and JAX-RS. These services can speak a variety of protocols such as SOAP, XML/HTTP, RESTful HTTP, or CORBA and work over a variety of transports such as HTTP, JMS or JBI.
Sample project https://github.com/vborrego/cxf-test
Sample SOAP and REST Web Service
Structure:
. |-- pom.xml |-- src | `-- main | |-- java | | `-- com | | `-- test | | |-- Calculator.java | | |-- ICalculator.java | | `-- TestService.java | `-- webapp | `-- WEB-INF | |-- applicationContext.xml | `-- web.xml `-- target
- mkdir -p /tmp/cxfSpringTest
- cd /tmp/cxfSpringTest
- mkdir -p src/main/webapp/WEB-INF/
- mkdir -p src/main/java/com/test/
- nano pom.xml
1 <project
2 xmlns="http://maven.apache.org/POM/4.0.0"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6 <groupId>com.test</groupId>
7 <artifactId>cxfSpringTest</artifactId>
8 <version>0.1</version>
9 <packaging>war</packaging>
10 <dependencies>
11 <dependency>
12 <groupId>org.apache.cxf</groupId>
13 <artifactId>cxf-rt-core</artifactId>
14 <version>2.4.1</version>
15 </dependency>
16 <dependency>
17 <groupId>org.apache.cxf</groupId>
18 <artifactId>cxf-bundle-jaxrs</artifactId>
19 <version>2.4.1</version>
20 </dependency>
21 <dependency>
22 <groupId>org.apache.cxf</groupId>
23 <artifactId>cxf-rt-frontend-jaxws</artifactId>
24 <version>2.4.1</version>
25 </dependency>
26 </dependencies>
27 </project>
- nano src/main/java/com/test/Calculator.java
1 package com.test;
2
3 public class Calculator implements ICalculator
4 {
5 public Calculator() {
6 System.out.println("Calculator created ");
7 }
8
9 public long add(long num1, long num2) {
10 return (num1 + num2);
11 }
12
13 public long subtract( long num1, long num2 ){
14 return num1 - num2;
15 }
16 }
- nano src/main/java/com/test/ICalculator.java
- nano src/main/webapp/WEB-INF/applicationContext.xml
1 <beans xmlns="http://www.springframework.org/schema/beans"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns:jaxws="http://cxf.apache.org/jaxws"
4 xmlns:jaxrs="http://cxf.apache.org/jaxrs"
5 xsi:schemaLocation=" http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
8 http://cxf.apache.org/jaxrs
9 http://cxf.apache.org/schemas/jaxrs.xsd
10 ">
11 <import resource="classpath:META-INF/cxf/cxf.xml"/>
12 <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
13 <!-- jax-ws -->
14 <bean id="calculatorService" class="com.test.Calculator" scope="singleton" />
15 <jaxws:endpoint implementor="#calculatorService" address="/calculator" />
16 <!-- jax-rs -->
17 <jaxrs:server id="testService" address="/">
18 <jaxrs:serviceBeans>
19 <ref bean="testService" />
20 </jaxrs:serviceBeans>
21 </jaxrs:server>
22 <bean id="testService" class="com.test.TestService" />
23 </beans>
- nano src/main/webapp/WEB-INF/web.xml
1 <web-app>
2 <!-- <context-param>
3 <param-name>contextConfigLocation</param-name>
4 <param-value>/WEB-INF/applicationContext.xml</param-value>
5 </context-param> default location for spring context -->
6 <servlet>
7 <servlet-name>CXFServlet</servlet-name>
8 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
9 </servlet>
10 <servlet-mapping>
11 <servlet-name>CXFServlet</servlet-name>
12 <url-pattern>/*</url-pattern>
13 </servlet-mapping>
14 <listener>
15 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
16 </listener>
17 <servlet>
18 <servlet-name>Spring</servlet-name>
19 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
20 <!-- <init-param>
21 <param-name>contextConfigLocation</param-name>
22 <param-value>/WEB-INF/applicationContext.xml</param-value>
23 </init-param> -->
24 <load-on-startup>0</load-on-startup>
25 </servlet>
26 </web-app>
- nano src/main/java/com/test/TestService.java
1 package com.test;
2 import javax.ws.rs.GET;
3 import javax.ws.rs.Path;
4 import javax.ws.rs.PathParam;
5 import javax.ws.rs.core.Response;
6
7 @Path("/testSvc")
8 public class TestService {
9
10 @GET
11 @Path("/{param}")
12 public Response getMsg(@PathParam("param") String msg) {
13 String out = String.format("testSvc returns %s", msg);
14 return Response.status(200).entity(out).build();
15 }
16
17 }
mvn clean compile package # builds cxfSpringTest-0.1.war
Test links:
Generate client:
wsimport -d src/main/java -keep -p com.test.client http://localhost:8081/cxfSpringTest-0.1/calculator?wsdl
nano com/test/client/Client.java
1 /*
2 vitor@darkstar:/tmp/cxfSpringTest/src/main/java
3 $ javac com/test/client/*.java
4 vitor@darkstar:/tmp/cxfSpringTest/src/main/java
5 $ java -cp . com.test.client.Client
6 AAAA
7 5
8 */
9 package com.test.client;
10
11 public class Client{
12 public static void main(String args[] ){
13 System.out.println("AAAA");
14 CalculatorService cs = new CalculatorService();
15 ICalculator ic = cs.getCalculatorPort();
16 long res = ic.add(2,3);
17 System.out.println(res);
18 }
19 }
Get project from GitHub
git clone https://github.com/vborrego/cxf-test
- cd cxf-test
- mvn clean install
http://localhost:8081/cxf-test-0.1/?_wadl&_type=xml # save as app.wadl
Generate client
- cp wadl-dist-1.1.6-bin.zip /tmp/
- cd /tmp/
- unzip wadl-dist-1.1.6-bin.zip
- cd wadl-dist-1.1.6
- cd bin
- export JAVA_HOME=/opt/java
- ./wadl2java
- ./wadl2java -o . -p test app.wadl