Spring整合CXF

来源:互联网 发布:charles游戏修改数据 编辑:程序博客网 时间:2024/06/05 13:27

1. 为什么要整合Spring

原因很简单,我们不能每次发布项目的时候都在Main函数中创建对象,交给Spring的IOC来管理是一个好的选择,况且CXF本身就提供了对Spring的支持.

2. 开始整合

2.0 需要的类的创建

这里做一个类似的员工管理的WebService的服务接口
Employee.java

/** * 员工类 */public class Employee {    private String name;    private int age;    private int id;    // ... 省略 get/set 方法}

EmployeeService.java<接口>

/** * 员工管理的Service接口 */@WebService(name="employeeService")public interface EmployeeService {    public void add(@WebParam(name="employee")Employee employee);    public @WebResult(name="employeeList")List<Employee> findAll();}

EmployeeServiceImpl.java<实现类>

public class EmployeeServiceImpl implements EmployeeService {    private List<Employee>employeeList = new ArrayList<Employee>();    @Override    public void add(Employee employee) {        employeeList.add(employee);    }    @Override    public List<Employee> findAll() {        return employeeList;    }}

2.1 添加JAR包

2.1.1 添加Spring的jar包

spring-aop-4.0.0.RELEASE.jarspring-beans-4.0.0.RELEASE.jarspring-context-4.0.0.RELEASE.jarspring-core-4.0.0.RELEASE.jarspring-expression-4.0.0.RELEASE.jarspring-web-4.0.0.RELEASE.jar

2.1.2 添加CXF需要的JAR包

asm-3.3.jarcom.springsource.org.apache.commons.httpclient-3.1.0.jarcxf-2.4.2.jarjetty-continuation-7.4.5.v20110725.jarjetty-http-7.4.5.v20110725.jarjetty-io-7.4.5.v20110725.jarjetty-security-7.4.5.v20110725.jarjetty-server-7.4.5.v20110725.jarjetty-util-7.4.5.v20110725.jarneethi-3.0.1.jarwsdl4j-1.6.2.jarxmlschema-core-2.0.jarcommons-codec-1.3.jarcommons-logging-1.1.1.jar

2.2 配置web.xml

既然交给Spring来管理,当然要配置Spring的ContextLocationListener了
还得配置CXF的CXFServlet

  <!-- 配置Spring的核心监听器 -->  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:spring.xml</param-value>  </context-param>  <!-- 配置CXF框架的Servlet -->  <servlet>    <servlet-name>cxf</servlet-name>    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>    <!-- 表示服务器启动就加载 -->    <load-on-startup>0</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>cxf</servlet-name>    <url-pattern>/ws/*</url-pattern>  </servlet-mapping>

2.3 spring.xml 配置
记得要在<beans ... >中配置
xmlns:jaxws="http://cxf.apache.org/jaxws"命名空间
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    xmlns:jaxws="http://cxf.apache.org/jaxws"    xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd        http://cxf.apache.org/jaxws         http://cxf.apache.org/schemas/jaxws.xsd">    <!-- 配置要暴露的服务的Bean -->    <bean id="employeeService" class="com.service.cxfspring.EmployeeServiceImpl" />    <!-- 配置CXF框架的 Bean -->    <!-- 配置cxf 地址: http://192.168.114.10:8080/CXF_Server/ws/employeeManager         组成 : http://192.168.114.10:8080 +CXF_Server( 项目名)+ws(过滤的路径)+/employeeManager(自定义部分)         服务类 : 服务的实现类: 拦截器 -->    <jaxws:server address="/employeeService" serviceClass="com.service.cxfspring.EmployeeService">        <!-- 服务的实现类 -->        <jaxws:serviceBean>            <ref bean="employeeService" />        </jaxws:serviceBean>        <!-- 配置输入显示日志信息的拦截器 -->        <jaxws:inInterceptors>            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>        </jaxws:inInterceptors>        <jaxws:outInterceptors>            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>        </jaxws:outInterceptors>    </jaxws:server></beans>

2.4 发布
1. 启动服务器,Spring会自动配置XML中注册的信息,并发布.
2. 输入URL地址测试
http://localhost:9090/web-service/ws/employeeService?wsdl
3. 得到WSDL描述文件,说明发布成功了

<?xml version="1.0" ?><wsdl:definitions name="EmployeeServiceService" targetNamespace="http://cxfspring.service.com/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://cxfspring.service.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <wsdl:types><xs:schema elementFormDefault="unqualified" targetNamespace="http://cxfspring.service.com/" version="1.0" xmlns:tns="http://cxfspring.service.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="add" type="tns:add"></xs:element><xs:element name="addResponse" type="tns:addResponse"></xs:element><xs:element name="findAll" type="tns:findAll"></xs:element><xs:element name="findAllResponse" type="tns:findAllResponse"></xs:element><xs:complexType name="add">    <xs:sequence>      <xs:element minOccurs="0" name="employee" type="tns:employee"></xs:element>    </xs:sequence>  </xs:complexType><xs:complexType name="employee">    <xs:sequence>      <xs:element name="age" type="xs:int"></xs:element>      <xs:element name="id" type="xs:int"></xs:element>      <xs:element minOccurs="0" name="name" type="xs:string"></xs:element>    </xs:sequence>  </xs:complexType><xs:complexType name="addResponse">    <xs:sequence></xs:sequence>  </xs:complexType><xs:complexType name="findAll">    <xs:sequence></xs:sequence>  </xs:complexType><xs:complexType name="findAllResponse">    <xs:sequence>      <xs:element maxOccurs="unbounded" minOccurs="0" name="employeeList" type="tns:employee"></xs:element>    </xs:sequence>  </xs:complexType></xs:schema>  </wsdl:types>  <wsdl:message name="add">    <wsdl:part element="tns:add" name="parameters">    </wsdl:part>  </wsdl:message>  <wsdl:message name="addResponse">    <wsdl:part element="tns:addResponse" name="parameters">    </wsdl:part>  </wsdl:message>  <wsdl:message name="findAllResponse">    <wsdl:part element="tns:findAllResponse" name="parameters">    </wsdl:part>  </wsdl:message>  <wsdl:message name="findAll">    <wsdl:part element="tns:findAll" name="parameters">    </wsdl:part>  </wsdl:message>  <wsdl:portType name="employeeService">    <wsdl:operation name="add">      <wsdl:input message="tns:add" name="add">    </wsdl:input>      <wsdl:output message="tns:addResponse" name="addResponse">    </wsdl:output>    </wsdl:operation>    <wsdl:operation name="findAll">      <wsdl:input message="tns:findAll" name="findAll">    </wsdl:input>      <wsdl:output message="tns:findAllResponse" name="findAllResponse">    </wsdl:output>    </wsdl:operation>  </wsdl:portType>  <wsdl:binding name="EmployeeServiceServiceSoapBinding" type="tns:employeeService">    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>    <wsdl:operation name="add">      <soap:operation soapAction="" style="document"></soap:operation>      <wsdl:input name="add">        <soap:body use="literal"></soap:body>      </wsdl:input>      <wsdl:output name="addResponse">        <soap:body use="literal"></soap:body>      </wsdl:output>    </wsdl:operation>    <wsdl:operation name="findAll">      <soap:operation soapAction="" style="document"></soap:operation>      <wsdl:input name="findAll">        <soap:body use="literal"></soap:body>      </wsdl:input>      <wsdl:output name="findAllResponse">        <soap:body use="literal"></soap:body>      </wsdl:output>    </wsdl:operation>  </wsdl:binding>  <wsdl:service name="EmployeeServiceService">    <wsdl:port binding="tns:EmployeeServiceServiceSoapBinding" name="employeeServicePort">      <soap:address location="http://localhost:9090/web-service/ws/employeeService"></soap:address>    </wsdl:port>  </wsdl:service></wsdl:definitions>

关于WSDL文件的描述解析,在上篇博客中已经说明,这里便不再赘述了.

2.5 总结

使用Spring整合CXF框架之后是的服务的发布变得更加的方便快捷.
配置也比较简单.需要注意的是Spring来管理的时候默认使用的JaxWsServerFactoryBean来发布的
所以,我们在EmloyeeService处要使用@WebService注解,才能将服务发布出去.

原创粉丝点击