CXF与Spring整合


      WebService的主要目标是跨平台的可互操作性。为了达到这一目标,WebService完全基于XML(可扩展标记语言)、XSD(XMLSchema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。简单的说WebService就是一个应用程序,它向外界提供了一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web调用来实现某个功能的应用程序。

 

      CXF一个Apache开源的WebService框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。SOA(Service-Oriented Architecture)面向服务架构是一种思想,它将应用程序的不同功能单元通过中立的契约(独立于硬件平台、操作系统和编程语言联系起来,使得各种形式的功能单元更好的集成。目前来说,WebService 是SOA 的一种较好的实现方式,WebService 采用HTTP 作为传输协议,SOAP(Simple Object Access Protocol)作为传输消息的格式。

 

      在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息 格式(或binding)和网络协议(transports)包括SOAP、XML(通过HTTP或JMS)进行访问。CXF同样支持多种model 如:JAX-WS,JBI,SCA和CORBA service。CXF设计成可灵活部署到各种容器中包括Spring-based,JBI,SCA, Servlet和J2EE容器。

 

熟悉了WebService的基础知识之后,入门CXF框架比较简单。CXF与Spring进行整合使用,大大的简化了开发工作。下面就拿HelloWorld来介绍CXF及WebService的基础性东西;

一、环境说明

  1、Spring的环境搭建,这里就不在说了。这里使用的spring2.5

  

  2、下载CXF,这里使用最新版本apache-cxf-2.6.2

 

 二 搭建CXF并与Spring进行整合

    1、所需的CXF的jar

 

    

    2、配置web.xml文件

 

 

 

Java代码   收藏代码
  1.     <!--配置CXFServlet begin-->  
  2. <servlet>  
  3.     <servlet-name>CXFServlet</servlet-name>  
  4.     <display-name>CXF Servlet</display-name>  
  5.     <servlet-class>  
  6.         org.apache.cxf.transport.servlet.CXFServlet  
  7.     </servlet-class>  
  8.     <load-on-startup>1</load-on-startup>  
  9. </servlet>  
  10. <servlet-mapping>  
  11.     <servlet-name>CXFServlet</servlet-name>  
  12.     <!-- url可自定义配置,用于CXFServlet请求地址拦截,访问会用到 -->  
  13.     <url-pattern>/webservice/*</url-pattern>  
  14. </servlet-mapping>  
  15. <!--配置CXFServlet end -->  
 

 

  

3、Web 服务的接口定义HelloWorld.java

 

 

Java代码   收藏代码
  1. @WebService(serviceName="HelloWorld",targetNamespace=Constants.WS_NAMESPACE)  
  2. public interface HelloWorld {  
  3.   
  4.     @WebMethod  
  5.     public String say(@WebParam(name="name")String name);  
  6.       
  7.     @WebMethod  
  8.     public String sayHello(@WebParam(name="user")User user);  
  9.       
  10.     @WebMethod  
  11.     public List<User> getList(Long id);  
  12. }         

 

 

 

 

 4、Web服务接口实现类 HelloWorldImpl.java

 

 

Java代码   收藏代码
  1.                      @Service("HelloWorldImpl")  
  2. public class HelloWorldImpl implements HelloWorld {  
  3.     public String say(String name) {  
  4.             return name+",您好!";  
  5.     }  
  6.   
  7.     public String sayHello(User user) {  
  8.         return user.getName()+",您好!";  
  9.     }  
  10.       
  11.     public List<User> getList(Long id){  
  12.         List<User> list = new ArrayList<User>();  
  13.         User user= new User();  
  14.         Long sid=1L;  
  15.         user.setId(sid);  
  16.         user.setName("张三"+sid);  
  17.         list.add(user);  
  18.           
  19.         user= new User();  
  20.         sid=2L;  
  21.         user.setId(sid);  
  22.         user.setName("张三"+sid);  
  23.         list.add(user);  
  24.   
  25.         return list;  
  26.     }  
  27. }  
 

注意:看到很多Web服务接口的实现类标注了 @WebService注解,我在这测试了实现类不标注该注解及@WebMethod正常。还没有看到具体文档

 

5、传递对象Customer的PO类定义

                       

 

Java代码   收藏代码
  1. @XmlRootElement(name="User")  
  2.             @XmlAccessorType(XmlAccessType.FIELD)  
  3.             @XmlType(name="User")  
  4.             public class User{  
  5.                   
  6.                 @XmlElement(nillable=true)  
  7.                 private Long id;  
  8.                   
  9.                 @XmlElement(nillable=true)  
  10.                 private String name;  
  11.                   
  12.                 @XmlElement(nillable=true)  
  13.                 private int age;  
  14.               
  15.                 public Long getId() {  
  16.                     return id;  
  17.                 }  
  18.               
  19.                 public void setId(Long id) {  
  20.                     this.id = id;  
  21.                 }  
  22.               
  23.                 public String getName() {  
  24.                     return name;  
  25.                 }  
  26.               
  27.                 public void setName(String name) {  
  28.                     this.name = name;  
  29.                 }  
  30.               
  31.                 public int getAge() {  
  32.                     return age;  
  33.                 }  
  34.               
  35.                 public void setAge(int age) {  
  36.                     this.age = age;  
  37.                 }  
  38.             }                     
  39.       
 

 

 

这里使用很多注解,对于这些注解请参考 WebService注解详细 

 

 

6、CXF的Spring配置文件appCtx-cxf.xml

 

 

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.     <beans xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:jaxws="http://cxf.apache.org/jaxws"  
  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.         <import resource="classpath:META-INF/cxf/cxf.xml" />  
  9.         <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  10.         <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  11.           
  12.           
  13.         <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />  
  14.         <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  15.           
  16.         <!--implementor:指定接口具体实现类,address:随意配-->  
  17.         <jaxws:endpoint id="helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  >  
  18.             <!-- 输入日志拦截器 -->  
  19.            <jaxws:inInterceptors>  
  20.                 <ref bean="inMessageInterceptor"/>  
  21.            </jaxws:inInterceptors>  
  22.            <!-- 输出日志拦截器 -->  
  23.            <jaxws:outInterceptors>  
  24.               <ref bean="outMessageInterceptor"/>  
  25.            </jaxws:outInterceptors>  
  26.         </jaxws:endpoint>  
  27.         <!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里提供了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,  
  28.         可以方便实现的调用WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要调用webservice,  
  29.         只要将client这个bean注入到需要使用的bean里。-->  
  30.         <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />  
  31.         <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  32.             <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />  
  33.             <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />  
  34.         </bean>  
  35.     </beans>        
 

 

 

7、运行服务器

   访问http://localhost:8080/demo/webservice/HelloWorld?wsdl 地址,您会看到很长的XML文件

 

     看到的XML一大堆,不容易明白。具体解释参考 WSDL解释

   

8、客户端测试

    

 

Java代码   收藏代码
  1. public class HelloWorldClient {  
  2.                 public static void main(String[] args) {  
  3.                     ApplicationContext context = new ClassPathXmlApplicationContext(  
  4.                             new String[] { "classpath*:/config/spring_cfg/appCtx-*.xml" });  
  5.                     HelloWorld client = (HelloWorld) context.getBean("client");  
  6.                     System.out.println(client.say("ABC"));  
  7.                       
  8.                     User user= new User();  
  9.                     customer.setName("张三");  
  10.                     System.out.println(client.sayHello(customer));  
  11.                       
  12.                     List<User> list = client.getList(1L);  
  13.                     for(User c:list){  
  14.                         System.out.println(c.getName());  
  15.                     }  
  16.                 }  
  17.             }  

猜你喜欢

转载自blog.csdn.net/onwingsofsong/article/details/45966481