一个CXF集成SPRING的WEBSERVICE完整实例

atjd1630 8年前

来自: http://blog.csdn.net/fenglibing/article/details/16842587


1 首先准备以下JAR包

activation.jar  commons-logging-1.1.1.jar  cxf-2.5.6.jar  jaxb-api-2.2.1.jar  jaxb-impl-2.1.3.jar  jaxws-api-2.2.8.jar  neethi-3.0.2.jar  ow2-jws-2.0-spec-1.0.11.jar  spring-aop-3.0.5.RELEASE.jar  spring-asm-3.0.5.RELEASE.jar  spring-beans-3.0.5.RELEASE.jar  spring-context-3.0.5.RELEASE.jar  spring-context-support-3.0.5.RELEASE.jar  spring-core-3.0.5.RELEASE.jar  spring-expression-3.0.5.RELEASE.jar  spring-oxm-3.0.5.RELEASE.jar  spring-web-3.0.5.RELEASE.jar  spring-ws-core-2.0.2.RELEASE.jar  spring-ws-security-2.0.2.RELEASE.jar  spring-xml-1.5.9.jar  stax-api-1.0.jar  stax2-api-3.1.1.jar  webservices-api-2.2.0-1.jar  webservices-extra-2.1-20.jar  woodstox-core-asl-4.1.2.jar  ws-test.jar  wsdl4j-1.6.2.jar  wss4j-1.6.7.jar  xmlschema-core-2.0.3.jar

我的环境是IBMJDK5,因而有一些xml及webservice包是不存在的,就会比在SUN JDK的环境中要多一些JAR包,如ow2-jws-2.0-spec-1.0.11.jar,webservices-api-2.2.0-1.jar,jaxws-api-2.2.8.jar等,根据实际情况进行选择了。

2 编写服务端
2.1 新建一个空的WEB工程,我这里命名为ws_test,将其放置于TOMCAT的webapps目录;
2.2 然后在ws_test下面建立WEB-INF文件夹,并在WEB-INF文件夹中建立目录lib;
2.3 将上面提到的JAR包都拷贝到lib目录中;
2.4 在WEB-INF目录中新建web.xml文件,并将如下内容放于其中:

<?xml version="1.0" encoding="ISO-8859-1"?>  <web-app 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"     version="2.5">       <description>        Web Service Test.      </description>          <display-name>Web Service Test</display-name>        <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath*:applicationContext-server.xml</param-value>    </context-param>      <listener>        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>    </listener>      <servlet>        <servlet-name>CXFService</servlet-name>        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>    </servlet>       <servlet-mapping>        <servlet-name>CXFService</servlet-name>        <url-pattern>/*</url-pattern>    </servlet-mapping>  </web-app>

这个配置文件是WEB应用的核心配置文件,如Listener的配置,servlet请求的映射等,这里并配置了启动的时候加载SPRING,并初使化我们的WEBSERVICE服务端配置文件。
2.5 在ECLIPSE中新建JAVA工程,并在工程中新建lib目录,将上面提到的JAR包全部放到lib目录,并将他们全部加入到classpath中;
2.6 增加服务端的JAVA类:

package com.use.test.ws.entity;  public class User {   int id ;   String name = null;   String address = null;    String email = null;   public int getId() {    return id;   }   public void setId(int id) {    this.id = id;   }   public String getName() {    return name;   }   public void setName(String name) {    this.name = name;   }    public String getAddress() {    return address;   }   public void setAddress(String address) {    this.address = address;   }    public String getEmail() {    return email;   }   public void setEmail(String email) {    this.email = email;   }    }

package com.use.test.ws.server;     import javax.jws.WebParam;     import javax.jws.WebService;     import javax.jws.soap.SOAPBinding;     import javax.jws.soap.SOAPBinding.Style;     import com.use.test.ws.entity.User;     /**   * <b>function:</b>定制客户端请求WebService所需要的接口   */     @WebService     @SOAPBinding(style = Style.RPC)     public interface IService {      public User getUserByName(@WebParam(name = "name") String name);      public void setUser(User user);  }

package com.use.test.ws.server;     import java.util.Date;  import javax.jws.WebParam;  import javax.jws.WebService;  import javax.jws.soap.SOAPBinding;  import javax.jws.soap.SOAPBinding.Style;  import com.use.test.ws.entity.User;     /**   * <b>function:</b> WebService传递复杂对象,如JavaBean、Array、List、Map等   */  @WebService  @SOAPBinding(style = Style.RPC)  @SuppressWarnings("deprecation")  public class TestService implements IService {      public User getUserByName(@WebParam(name = "name") String name) {          User user = new User();          user.setId(new Date().getSeconds());          user.setName(name);          user.setAddress("china");          user.setEmail(name + "@test.com");          return user;      }      public void setUser(User user) {          System.out.println("############Server setUser###########");          System.out.println("setUser:" + user);      }  }

2.7 在src目录下建立applicationContext-client.xml,并放入以下内容:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"/> <bean id="userServiceBean" class="com.use.test.ws.server.TestService"/> <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/> <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> <jaxws:server id="userService" serviceClass="com.use.test.ws.server.IService" address="/Users"> <jaxws:serviceBean> <ref bean="userServiceBean"/> </jaxws:serviceBean> <jaxws:inInterceptors> <ref bean="inMessageInterceptor"/> </jaxws:inInterceptors> <jaxws:outInterceptors> <ref bean="outLoggingInterceptor"/> </jaxws:outInterceptors> </jaxws:server> </beans> 
</div>

2.8 将建立的JAVA工程导出jar包,只导出src下面的内容即,并将这个jar包放到上面的TOMCAT工程中的ws_test/WEB-INF/lib目录下,并启动TOMCAT服务器;
2.9 启动成功后,此时访问URL:http://localhost:8080/ws_test/Users?wsdl,应该会看到WSDL的输出。

3 编写客户端
3.1 独立的客户端请求类

package com.use.test.ws.client;  import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  import com.use.test.ws.entity.User;  import com.use.test.ws.server.IService;  public class TestClient {      public static void main(String[] args) {          JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();          factory.setServiceClass(IService.class);          factory.setAddress("http://localhost:8080/ws_test/Users");          IService service = (IService) factory.create();          System.out.println("#############Client getUserByName##############");          User user = service.getUserByName("hoojo");          System.out.println(user);          user.setAddress("China-Guangzhou");          service.setUser(user);      }  }

点击右键就可以运行这个类。
3.2 与SPRING的集成,首先需要在src下面建立配置文件applicationContext-client.xml,将输入以下内容:

<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"      xmlns:context="http://www.springframework.org/schema/context"      xmlns:jaxws="http://cxf.apache.org/jaxws"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      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:client id="userWsClient" serviceClass="com.use.test.ws.server.IService" address="http://localhost:8080/ws_test/Users"/>  </beans>

3.3 建立JAVA类

package com.use.test.ws.client;     import org.springframework.context.ApplicationContext;  import org.springframework.context.support.ClassPathXmlApplicationContext;  import com.use.test.ws.entity.User;  import com.use.test.ws.server.IService;     /**   * <b>function:</b>请求Spring整合CXF的WebService客户端   */     public class SpringUsersWsClient {      public static void main(String[] args) {          ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");          IService service = ctx.getBean("userWsClient", IService.class);          System.out.println("#############Client getUserByName##############");          User user = service.getUserByName("hoojo");          System.out.println(user);          user.setAddress("China-Guangzhou");          service.setUser(user);      }  }

直接运行这个类就OK了。

4 说明
这个实例其本上是完全照搬这篇文章,http://www.cnblogs.com/hoojo/archive/2011/03/30/1999563.html,但是因为拿到我本地后无法运行,因而我这里做了一下整理。