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.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
2.1.2 添加CXF需要的JAR包
asm-3.3.jar
com.springsource.org.apache.commons.httpclient-3.1.0.jar
cxf-2.4.2.jar
jetty-continuation-7.4.5.v20110725.jar
jetty-http-7.4.5.v20110725.jar
jetty-io-7.4.5.v20110725.jar
jetty-security-7.4.5.v20110725.jar
jetty-server-7.4.5.v20110725.jar
jetty-util-7.4.5.v20110725.jar
neethi-3.0.1.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.jar
commons-codec-1.3.jar
commons-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注解,才能将服务发布出去.