Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。

 该框架提供了以下功能:

  • Web 服务标准支持:CXF 支持以下 Web 服务标准:
    • Java API for XML Web Services (JAX-WS)
    • SOAP
    • Web 服务描述语言(Web Services Description Language ,WSDL)
    • 消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)
    • WS-Basic Profile
    • WS-Addressing
    • WS-Policy
    • WS-ReliableMessaging
    • WS-Security
  • 前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。
  • 工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。
  • RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。
  • 对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。
  • 对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。
  • code first 或者 xml first  : 支持使用code first 或者 xml first 的方式来创建web服务。
       

  一  借助 annotation 创建独立启动的web 服务。

准备:<1>  新建工程 导入需要的jar 包, 可从apache官方网站下载 apache-cxf-2.7.18, 然后从apache-cxf-2.7.18/lib 目录中可获得所有必需的jar包。=====》》也可通过maven来引入所需的jar包(修改配置文件pom.xml增加依赖)
           <2> .新建Web Service Project工程:"File->New->web service project";增加jar包:右击工程名->build path->configure build path->add external jars

             1. 首先写服务接口
package com.qsp.demo.service;

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService<span style="white-space:pre">	</span>//这个(<span style="font-family: Arial, Helvetica, sans-serif;">@WebService</span><span style="font-family: Arial, Helvetica, sans-serif;">)annotation必需写,客户端从这里entry;</span>
public interface HelloWorld {
    public String sayHi(@WebParam(name="CiNo") String ciNo);<span style="white-space:pre">		</span>//(@WebParam)取ciNo的别名,默认名:arg0
}
   
       2  实现服务接口
package com.qsp.demo.service;

import javax.jws.WebService;

@WebService(serviceName="HelloWorld",endpointInterface="com.qsp.demo.service.HelloWorld") 
public class HelloWorldImpl implements HelloWorld{

	public String sayHi(String ciNo) {	
		  return "Hello " + ciNo;
	}

}
            3  编写ServicePublish.java 公布web服务供客户端调用
package com.qsp.demo.cxf.demo;


import javax.xml.ws.Endpoint;


public class Server {


    protected Server() throws Exception {
        System.out.println("Starting Server");
        HelloWorldImpl implementor = new HelloWorldImpl();
        String address = "http://localhost:8080/HelloWorld";
        Endpoint.publish(address, implementor);
    }


    public static void main(String args[]) throws Exception {
        new Server();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}

           4  run ServicePublish.java 类来启动服务。 访问 http://localhost:8080/HelloWorld?wsdl查看是否显示

     wsdl。

          5  编写客户端访问服务(有二种方法)
          第一种:
package com.qsp.demo.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.qsp.demo.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class HelloWorldClient {

	 private static final QName SERVICE_NAME 
     = new QName("http://service.demo.qsp.com/", "HelloWorld");  //服务接口名
     private static final QName PORT_NAME 
     = new QName("http://service.demo.qsp.com/", "HelloWorldPort");  //端口名是固定的,接口名+Port(区分大小写)

	public static void main(String[] args) {
		Service service = Service.create(SERVICE_NAME);
		
		String endpointAddress = "http://localhost:8080/HelloWorld";	
		service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);	
                HelloWorld hw = service.getPort(HelloWorld.class);
                System.out.println(hw.sayHi("World"));
		
	}

}
         第二种:
package com.qsp.demo.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.qsp.demo.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class HelloWorldClient {

	public static void main(String[] args) {	
           JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
           svr.setServiceClass(HelloWorld.class);
           svr.setAddress("http://localhost:8080/HelloWorld");
           HelloWorld hw = (HelloWorld) svr.create();
           System.out.println(hw.sayHi("World"));
	}

}
 
  6  测试: run ServicePublish.java 类来启动服务,然后 run HelloWorldClient.java 来访问服务。

             二 集成到spring 中
     
               1  在 applicationContext.xml 中加入:
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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="HelloWorld"
              implementor="com.qsp.demo.service.HelloWorldImpl"
              address="HelloWorld" />
          <bean id="client" class="com.qsp.demo.service.HelloWorld" 
                    factory-bean="clientFactory" factory-method="create"/>
    
          <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
                    <property name="serviceClass" value="com.qsp.demo.service.HelloWorld"/>
                    <property name="address" value="http://localhost:8080/CXFSimpDemo/webService/HelloWorld"/>  //<pre name="code" class="html" style="color: rgb(73, 73, 73); font-size: 14px; line-height: 22.4px;">CXFSimpDemo为工程名    webService为<servlet-mapping>里配置的<url-pattern>

</bean> </beans>
 
 

              2 在 web.xml 中加入 :
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance " 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext.xml</param-value>
  </context-param>
  
  <listener>
   	<listener-class>
    	org.springframework.web.context.ContextLoaderListener
   	</listener-class>
  </listener>
  
  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <display-name>CXFServlet</display-name>
    <servlet-class>
       org.apache.cxf.transport.servlet.CXFServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

    <servlet-mapping>
       <servlet-name>CXFServlet</servlet-name>
       <url-pattern>/webService/*</url-pattern>
    </servlet-mapping>
    
</web-app>
        
         3  修改客户端HelloWorldClient.java 为:

package com.qsp.demo.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.qsp.demo.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class HelloWorldClient {

public static void main(String[] args) {
	
		ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
		HelloWorld client = (HelloWorld)context.getBean("client");
		System.out.println(client.sayHi("world"));
	}
}
           
                   4  发布工程,启动web服务器
                  
                   5 访问http://localhost:8080/CXFSimpDemo/webService/HelloWorld?wsdl 查看是否显示 wsdl 。

   6 run HelloWorldClient.java 访问web服务。

     注:在apache-cxf-2.7.18/samples/目录下有大量的实例,可去参考参考

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐