So easy Webservice 8.spring整合CXF 发布WS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了So easy Webservice 8.spring整合CXF 发布WS相关的知识,希望对你有一定的参考价值。
1.添加jar包(cxf的jar包中包含了spring的jar包),添加spring配置文件
2.web.xml中配置CXFServlet,过滤WS服务的地址
<!-- 配置CXFServlet,实现地址过滤的功能,项目启动时实例化 --> <servlet> <servlet-name>cxfServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>csfServlet</servlet-name> <!-- 访问 http://localhost:8080/工程名/ws/ 下的所有请求,都会交给当前servlet过滤 --> <url-pattern>/ws/*</url-pattern> </servlet-mapping>
<!-- 由于上面的url-pattern中配置了过滤路径,所有ws服务地址应配置为:http://localhost:8080/工程名/ws/xxxService -->
3.配置applicationContext.xml
3.1 web.xml中配置spring监听器,在项目启动时加载spring配置文件
<!-- 配置监听器:加载spring配置文件 --> <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>
3.2 添加ws服务实现类(必须添加注解@WebService),在spring中配置服务实现类的bean
import java.util.ArrayList; import java.util.List; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; @WebService( serviceName="UserService", name="user", portName="UserServicePort", targetNamespace="com.mlxs.ws.cxfws.spring" ) public class UserServiceImpl { private static List<User> ulist = new ArrayList<User>(); @WebMethod(operationName="add") public void add(@WebParam(name="u") User u) { ulist.add(u); } @WebMethod(operationName="query") //@WebResult 如果是集合,指定的是集合中存放的对象名称 public @WebResult(name="user") List<User> query() { return ulist; } }
<bean id="userService" class="com.mlxs.ws.cxfws.spring.UserServiceImpl"/>
3.3 添加jaxws标签
在cxf.jar中,找到/schemas/jaxws.xsd,再查找命名空间:targetNamespace="http://cxf.apache.org/jaxws",将内容复制到spring文件中:
xmlns:jaxws="http://cxf.apache.org/jaxws"
再在xsi:schemaLocation中添加(别名 实际地址):
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
3.4 配置CXF, 把服务实现类bean配置发布成WS服务 ;
address="/user"中不用配置前缀,ws地址在web.xml中servlet的配置的:http://localhost:8080/工程名/ws/user;
配置日志;
<jaxws:server address="/user"> <jaxws:serviceBean> <ref bean="userService"/> </jaxws:serviceBean> <!-- 配置日志 --> <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> </jaxws:outInterceptors> </jaxws:server>
4.部署到tomcat,启动服务,使用浏览器访问http://localhost:8080/webservice_cxf_server/ws/user?WSDL
<wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="com.mlxs.ws.cxfws.spring" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserService" targetNamespace="com.mlxs.ws.cxfws.spring"> <wsdl:types> <xs:schema xmlns:tns="com.mlxs.ws.cxfws.spring" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="com.mlxs.ws.cxfws.spring" version="1.0"> <xs:element name="add" type="tns:add"/> <xs:element name="addResponse" type="tns:addResponse"/> <xs:element name="query" type="tns:query"/> <xs:element name="queryResponse" type="tns:queryResponse"/> <xs:complexType name="query"> <xs:sequence/> </xs:complexType> <xs:complexType name="queryResponse"> <xs:sequence> <xs:element maxOccurs="unbounded" minOccurs="0" name="user" type="tns:user"/> </xs:sequence> </xs:complexType> <xs:complexType name="user"> <xs:sequence> <xs:element name="id" type="xs:int"/> <xs:element minOccurs="0" name="name" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="add"> <xs:sequence> <xs:element minOccurs="0" name="u" type="tns:user"/> </xs:sequence> </xs:complexType> <xs:complexType name="addResponse"> <xs:sequence/> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="queryResponse"> <wsdl:part element="tns:queryResponse" name="parameters"></wsdl:part> </wsdl:message> <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="query"> <wsdl:part element="tns:query" name="parameters"></wsdl:part> </wsdl:message> <wsdl:portType name="user"> <wsdl:operation name="query"> <wsdl:input message="tns:query" name="query"></wsdl:input> <wsdl:output message="tns:queryResponse" name="queryResponse"></wsdl:output> </wsdl:operation> <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:portType> <wsdl:binding name="UserServiceSoapBinding" type="tns:user"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="query"> <soap:operation soapAction="" style="document"/> <wsdl:input name="query"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="queryResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="add"> <soap:operation soapAction="" style="document"/> <wsdl:input name="add"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="addResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="UserService"> <wsdl:port binding="tns:UserServiceSoapBinding" name="UserServicePort"> <soap:address location="http://localhost:8080/webservice_cxf_server/ws/user"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
5.使用myeclipse SOAP浏览器浏览:
调用add服务接口添加数据:
查看控制台:
Address: http://localhost:8080/webservice_cxf_server/ws/user Encoding: UTF-8 Http-Method: POST Content-Type: text/xml; charset=utf-8 Headers: {Accept=[application/soap+xml, application/dime, multipart/related, text/*], cache-control=[no-cache], connection=[close], Content-Length=[371], content-type=[text/xml; charset=utf-8], host=[localhost:8080], pragma=[no-cache], SOAPAction=[""], user-agent=[IBM Web Services Explorer]} Payload: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="com.mlxs.ws.cxfws.spring" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <q0:add> <u> <id>1</id> <name>admin</name> </u> </q0:add> </soapenv:Body> </soapenv:Envelope>
调用查询服务接口query:
控制台:
---------------------------- ID: 12 Address: http://localhost:8080/webservice_cxf_server/ws/user Encoding: UTF-8 Http-Method: POST Content-Type: text/xml; charset=utf-8 Headers: {Accept=[application/soap+xml, application/dime, multipart/related, text/*], cache-control=[no-cache], connection=[close], Content-Length=[288], content-type=[text/xml; charset=utf-8], host=[localhost:8080], pragma=[no-cache], SOAPAction=[""], user-agent=[IBM Web Services Explorer]} Payload: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="com.mlxs.ws.cxfws.spring" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <q0:query/> </soapenv:Body> </soapenv:Envelope> -------------------------------------- 2016-1-28 23:38:35 org.apache.cxf.interceptor.AbstractLoggingInterceptor log 信息: Outbound Message --------------------------- ID: 12 Encoding: UTF-8 Content-Type: text/xml Headers: {} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:queryResponse xmlns:ns2="com.mlxs.ws.cxfws.spring"><user><id>1</id><name>admin</name></user><user><id>2</id><name>魅力小生</name></user></ns2:queryResponse></soap:Body></soap:Envelope> --------------------------------------
也可以自己写jsp或者java测试类进行ws服务接口的访问。。。
以上是关于So easy Webservice 8.spring整合CXF 发布WS的主要内容,如果未能解决你的问题,请参考以下文章
So easy Webservice 8.spring整合CXF 发布WS