使用CXF 开发SOAP webservice 服务端实例

来源:互联网 发布:f调8孔洞箫制作数据 编辑:程序博客网 时间:2024/05/17 05:16

由于在之前做的一些项目中写数据交换的接口用的都是soap 的webService;所以在昨天晚上特地写了一个基于soap协议 webService的demo实例。在贴出相关demo之前,先对几个名词进行解释:

一个web service 服务的三要素:

  SOAP协议:Simple Object Access Protocol,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构信息;SOAP是基于XML。

WSDL:一个XML格式文档,用以描述服务端口访问方式和使用协议的细节。通常用来辅助生成服务器和客户端代码及配置信息。

UUDI:一个用来发布和搜索WEB服务的协议,应用程序可借由此协议在设计或运行时找到目标WEB服务。

好了,接下来来说说我的那个实例;我是模拟从客户端往服务端同步用户数据的接口服务;是使用Apache CXF进行开发的。首先我要先在Eclipse中创建一个maven工程项目; 然后在pom.xml 引入需要的jar (注意 我是基于spring 集成的 ,使用jetty 进行部署的;所以也要导入对应的jar 和插件)。

然后创建并且配置WSDL,和XSD 文件;然后在pom.xml 中引入apche cxf 支持自动生成WSDL代码的插件:

交互请求、响应实体的soapDemo.xsd 代码:

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.deppon.com/soap/soapDemoService"xmlns:tns="http://www.deppon.com/soap/soapDemoService"elementFormDefault="qualified">         <annotation><documentation>soap webService demo </documentation></annotation><element name="demoRequest" type="tns:demoRequest" /><element name="demoResponse" type="tns:demoResponse" /><complexType name="demoRequest">  <sequence>        <element name="userName" minOccurs="1" maxOccurs="1"type="string"><annotation><documentation>用户名</documentation></annotation></element> <element name="userCode" minOccurs="1" maxOccurs="1"type="string"><annotation><documentation>用户工号</documentation></annotation></element> <element name="title" minOccurs="1" maxOccurs="1"type="string"><annotation><documentation>职位</documentation></annotation></element>  </sequence></complexType><complexType name="demoResponse"><sequence><element name="userName" minOccurs="1" maxOccurs="1"type="string"><annotation><documentation>用户名</documentation></annotation></element><element name="resultCode" type="string"><annotation><documentation>1 成功 ,0 系统异常</documentation></annotation></element><element name="resultReason" type="string"><annotation><documentation>错误原因</documentation></annotation></element></sequence></complexType></schema>
交互服务Service的WSDL配置:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"   xmlns:tns="http://www.deppon.com/soap/soapDemoService"   xmlns:tns_domain="http://www.deppon.com/soap/soapDemoService"   xmlns:tns_header="http://www.deppon.com/soap/header"  xmlns:tns_exception="http://www.deppon.com/soap/exception"   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"   xmlns:xsd="http://www.w3.org/2001/XMLSchema"   name="soapDemoServiceImpl"   targetNamespace="http://www.deppon.com/soap/soapDemoService" >  <wsdl:types>    <xsd:schema targetNamespace="http://www.deppon.com/soap/soapDemoService">     <xsd:include schemaLocation="soapDemo.xsd"></xsd:include>    </xsd:schema>    <xsd:schema targetNamespace="http://www.deppon.com/soap/header"><xsd:include schemaLocation="ESBHeader.xsd" /></xsd:schema><xsd:schema targetNamespace="http://www.deppon.com/soap/exception"><xsd:include schemaLocation="CommonException.xsd" /></xsd:schema>  </wsdl:types>    <wsdl:message name="ESBHeader"><wsdl:part name="header" element="tns_header:esbHeader" ></wsdl:part></wsdl:message><wsdl:message name="CommonException"><wsdl:part name="commonExceptionInfo" element="tns_exception:commonExceptionInfo" ></wsdl:part></wsdl:message><wsdl:message name="demoRequest"><wsdl:part name="esbHeader" element="tns_header:esbHeader"></wsdl:part><wsdl:part name="demoRequest" element="tns_domain:demoRequest"></wsdl:part></wsdl:message><wsdl:message name="demoResponse"><wsdl:part name="esbHeader" element="tns_header:esbHeader"></wsdl:part><wsdl:part name="demoResponse" element="tns_domain:demoResponse"></wsdl:part></wsdl:message>    <wsdl:portType name="soapDemoService">    <wsdl:operation name="soapDemoService">      <wsdl:input message="tns:demoRequest"/>      <wsdl:output message="tns:demoResponse"/>      <wsdl:fault name="commonException" message="tns:CommonException"></wsdl:fault>    </wsdl:operation>  </wsdl:portType>    <wsdl:binding name="SoapDemoServiceImplBinding" type="tns:soapDemoService">    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>    <wsdl:operation name="soapDemoService" xmlns="http://www.deppon.com/soap/soapDemoService"><!--       <soap:operation soapAction="http://www.deppon.com/ows/waybillStatusBack"/> -->      <wsdl:input>      <soap:header use="literal" part="esbHeader" message="tns:demoRequest"></soap:header>        <soap:body use="literal" parts="demoRequest"/>      </wsdl:input>      <wsdl:output>      <soap:header use="literal" part="esbHeader" message="tns:demoResponse"></soap:header>        <soap:body use="literal" parts="demoResponse"/>      </wsdl:output>      <wsdl:fault name="commonException" xmlns="http://www.deppon.com/soap/exception"><soap:fault use="literal" name="commonException"/></wsdl:fault>    </wsdl:operation>  </wsdl:binding>    <wsdl:service name="SoapDemoServiceImpl">    <wsdl:port binding="tns:SoapDemoServiceImplBinding" name="SoapDemoServiceImplPort">      <soap:address location="http://10.224.70.24:8090/test/com/soapDemoService"/>    </wsdl:port>  </wsdl:service></wsdl:definitions>
 在pom.xml 中配置cxf 自动生成WSDL的插件:

<!-- wsdl生成service插件 --><plugin><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>${cxf-version}</version><executions><execution><id>generate-sources</id><phase>generate-sources</phase><configuration><fork>once</fork><additionalJvmArgs>-Dfile.encoding=UTF-8</additionalJvmArgs><!-- <encoding>UTF-8</encoding> --><defaultOptions><extraargs><extraarg>-fe</extraarg><extraarg>jaxws21</extraarg></extraargs></defaultOptions><!-- <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot> --><sourceRoot>${basedir}/src/main/java/</sourceRoot> <wsdlOptions><wsdlOption>                                      <wsdl>${basedir}/src/main/resources/wsdl/com/soap/test/server/soapDemoService.wsdl</wsdl>                                   </wsdlOption>  </wsdlOptions> </configuration><goals><goal>wsdl2java</goal></goals></execution></executions></plugin>
接下来,通过插件 生成对应的request、response实体类,和Service;并且创建实现服务端接口的实现类UserServiceImpl:

UserServiceImpl的代码:

<pre name="code" class="java">/** * webService 服务端实现类 * @author leo * */public class UserServiceImpl implements SoapDemoService{//￈ᅰᅱᄒ테ᅡᄐprivate static final Log LOG = LogFactory.getLog(UserServiceImpl.class);/** * soap 接口实现的方法 */@Overridepublic DemoResponse soapDemoService(Holder<ESBHeader> esbHeader,DemoRequest demoRequest) throws CommonException {DemoResponse res =new DemoResponse();if(null != demoRequest ){LOG.info(demoRequest.getUserName());LOG.info(demoRequest.getTitle());res.setResultCode("1");res.setResultReason("login sucess");}return res;}}

接下来配置web.xml 和配置sping.xml中的接口服务:

<?xml version="1.0" encoding="UTF-8"?><web-app id="web" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name> alert job</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:com/deppon/rest/META-INF/ds-spring.xml</param-value></context-param> <filter>        <filter-name>encodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>UTF-8</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>encodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping><!-- 日志配置文件的位置 --><context-param><param-name>log4jConfigLocation</param-name><param-value>/WEB-INF/log4j.xml</param-value></context-param><listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- webApp 配置 --><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>/soap/*</url-pattern>    </servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list></web-app>

spring配置文件中配置服务:

<bean id="userServiceImpl" class="com.deppon.soap.server.Service.UserServiceImpl"/><!--  web service--><jaxws:endpoint id="userServiceImplDemo" implementor="#userServiceImpl" address="/userServiceImpl"><jaxws:features><bean class="org.apache.cxf.feature.LoggingFeature"></bean></jaxws:features><jaxws:inInterceptors><bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/></jaxws:inInterceptors><jaxws:outInterceptors><bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/></jaxws:outInterceptors>

配置好了这些,之后一个SOAP的webService 接口的服务端就写好了。然后启动jetty 服务,测试一下看下服务是否已经通了。


说明服务端已经通了,

0 0