ApacheCXF

http://cxf.apache.org/

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

   1 mkdir -p /tmp/cxfSpringTest
   2 cd  /tmp/cxfSpringTest
   3 mkdir -p src/main/webapp/WEB-INF/
   4 mkdir -p src/main/java/com/test/

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>

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 }

src/main/java/com/test/ICalculator.java

   1 package com.test;
   2 import javax.jws.WebService;
   3 
   4 @WebService
   5 public interface ICalculator {
   6     public long add(long num1 , long num2 );
   7     public long subtract(long num1, long num2 );
   8 }

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>

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 }

   1 mvn clean compile package # builds cxfSpringTest-0.1.war
   2 # Test links: 
   3 # http://localhost:8080/cxfSpringTest-0.1/services
   4 # http://localhost:8080/cxfSpringTest-0.1/testSvc/1001
   5 # Generate client:
   6 wsimport -d src/main/java -keep -p com.test.client http://localhost:8081/cxfSpringTest-0.1/calculator?wsdl

com/test/client/Client.java

   1 /*
   2 cd /tmp/cxfSpringTest/src/main/java
   3 javac com/test/client/*.java
   4 java -cp . com.test.client.Client 
   5 AAAA
   6 5
   7 */
   8 package com.test.client;
   9 
  10 public class Client{
  11     public static void main(String args[] ){
  12         System.out.println("AAAA");
  13         CalculatorService cs = new CalculatorService();
  14         ICalculator ic = cs.getCalculatorPort();
  15         long res = ic.add(2,3);
  16         System.out.println(res);
  17     }    
  18 }

Get project from GitHub

   1 git clone https://github.com/vborrego/cxf-test
   2 cd cxf-test
   3 mvn clean install
   4 # http://localhost:8081/cxf-test-0.1/calculator?wsdl
   5 # http://localhost:8081/cxf-test-0.1/services
   6 # http://localhost:8081/cxf-test-0.1/testSvc/1001
   7 # http://localhost:8081/cxf-test-0.1/?_wadl&_type=xml # save as app.wadl
   8 

Generate client

   1 wget http://search.maven.org/remotecontent?filepath=org/jvnet/ws/wadl/wadl-dist/1.1.6/wadl-dist-1.1.6-bin.zip
   2 cp wadl-dist-1.1.6-bin.zip /tmp/
   3 cd /tmp/
   4 unzip wadl-dist-1.1.6-bin.zip 
   5 cd wadl-dist-1.1.6
   6 cd bin
   7 export JAVA_HOME=/opt/java
   8 ./wadl2java
   9 ./wadl2java -o . -p test app.wadl

JAX-WS Response.status

Commonly used status codes defined by HTTP

CXF sample WSSE

Java/ApacheCXF (last edited 2023-05-26 16:04:46 by 127)