




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WebService 四种发布方式总结Author:yczhang1. CXF 方式CXF与spring搭建webservice是目前最流行的方式,但是传闻cxf与jdk1.5有些不兼容,我没有遇到过,我遇到的问题是cxf与was6.1.1不兼容,表现在cxf必须的jar包“wsdl4j-1.6.2.jar”报错,报的错为:java.lang.IncompatibleClassChangeError,明显的jar包不兼容问题,很是头痛,后来查找资料找到解决办法是,将上述jar包新建一个was共享库,可以解决,但是客户周经理不想用此种方式,因为需要修改was,于是改用了axis2方式,下文会介绍
2、。该问题在此处做个记录,以后使用cxf与was的时候需要注意!使用cxf+spring搭建WebService:第一步, 添加jar包。 此处需要注意, 不同环境 (tomcat、was) jar也不一定相同, 例如我本地cxf+spring只需要如下jar包:出W311L处4,的丫生ins-1iL.1.1.jaiEO,出ad5S.jarLOS也TH目.gDCLd讪71f3i20至91%叮-3.d6MLEASEjir整:L$窗jb-iag-n-3.D.GULEMEjuS3,032匡产primg-kML10BHfcLK谑工jtr的电5如|&ipiidgrEvNext30-S.RELZAE
3、.jstG70之5。匡取1!熹rQhULEE)*382,184区i=式*T.0.G.MLIATE.jaira.T52iprifttlbi-S-06kSL&AS良j*r曳&*工过廿75.2,140.4.29mls5h.Mii4-eor*-?D3.jtr162,818而泰康的was环境则需要如下jar包:dVli-5AEL-*j!Jfib.(|JA*却止他声J,:柏AitJurJi醯srf-221.J4T篁馁IXKJ*r38软叵TnilnffT.jiwriKlIW,艇IJ;*T&Jir通唐W-Qp.|irib-njut1nn1LLmi”面*2n:四TwnB?14ABgwui
4、|nEr,ju3j2013/0*22iq*ExkrmtAZT题4T即ErauiiriC!O_w|s!=L1,.2013/0122I9:SBHxitdralIIXJIBJ-rLSHEL*jfctb-jKT2013/eSi;我:三工K工gjTS3,E2jixb-iviL-.1.9ju式II二也TE213:EEHxa.co.tLZLHJU.容3TEEj-2.J.jKE19:%ZjLR.cm.1LnJr一MJ%jfcwj_3.3jr33M,出毛岫:搏包i/eHdl-Ju-ZJ匹J0*,RlLfl晒r&HFE/5作:反虐)Jr3L;J处L66EE0FREL7E.j-u-201%也巧15:2Bic
5、处SffT即乎一5t*H-i!LpL1.01J-4J20婚俄代作:乐Eiscxit-sj:1e址30EEwE.J14J-L也dJUT14:22ZJIvtHJ.1KJML峪kLBi*0JKTAjr+diibl+Ja-bM3的 对过皿那LL ?Jii4斌111,叼王IT3事C3 JMrL贴部load-on-startupCXFServlet/servlet-name/webservice/*/url-pattern上述标记的地方,第一处是spring配置文件路径;第二出是wsdl地址内容;第三步,编写接口类与实现类,注意注解接口类WebServicepublicinterfaceSendServi
6、cepublicbooleansendOA(WebParam(name=param)Stringparam);publicbooleansendOrg(OrgEntityorg);明显的多了很多,原因应该是服务器jar包池的不同。根据错误提示缺什么补什么就可以了,注意jar包勿重复。第二步,配置web.xml文件,如下(重要的地方已标记)param-nameparam-value/context-paramcontextConfigLocationclasspath:/applicationContext.xmlparam-valueorg.springframework.web.contex
7、t.ContextLoaderListener/listener-classfilter-namefilter-classterencodingFilterorg.springframework.web.filter.CharacterEncodingFilencodingUTF-8filter-mappingfilter-nameurl-pattern/filter-mappingencodingFilter/*/url-patternCXFServlet/servlet-nameorg.apache.cxf.transport.servlet.CXFServlet1servlet-name
8、实现类WebService(endpointInterface=com.service.SendService,serviceName=sendService)publicclassSendServiceImplimplementsSendServicepublicbooleansendOA(Stringparam)System.out.println(sendOAparam:+param);if(param.equals(zhoujian)returntrue;returnfalse;publicbooleansendOrg(OrgEntityorg)System.out.println(s
9、endOrg-begin);returntrue;第四步,Spring配置文件!-“jaxws:client”该标签可以不必写,访问时可以手动拼接该url第五步,发布,直接部署到服务器,访问:1:9080/Wb/webservice/sendServie?wsdl2. Xfire 方式据说xfire方式已经很老了,但个人感觉,xfire方式很简单且容易配置,不知为啥过时了,也没感觉cxf、axis2哪里先进,我当时卡在cxf与was搞不定时想尝试xfire方式被周经理给拒绝了。Xfire方式发布webservice:第一步,添加jar包,如下:=activa
10、tion_1.L:jar巴.3.jarcommons!oggingrl口4jar4jaKivsiqpi-2.0,jarjsr173_4pi-L.jrjsaij-api-1,3.jarspring_1.2.6.jxr”4:一:E】i=if2.0jarIIBxEirei-tgis-lu2.6.jarjxfi1B2.6Pjar但户Eirij2.6.jar81 airspri1.2.B.jar,LXmlSchems&l.1.jar第二步,修改web.xml文件XFireServletorg.codehaus.xfire.transport.http.XFireConfigurableServl
11、et0XFireServlet/services/*第三步,编写接口类接口类:publicabstractinterfaceIBankingServicepublicabstractStringtransferFunds(StringparamString1);实现类:publicclassBankingServiceimplementsIBankingServicepublicStringtransferFunds(StringfromAccount)(returnfromAccount+:ok;)第四步,编写services.xml配置文件ons-teanuti1歹1.7,mipcl1电力
12、上=3.0.jarjjaxwi-!.jartofcijdm-L0.jar一面鼻il-1.4.jartsaaj-iiipl-!B3-jarstau-api-l.0.1.jit智匕七K-asl-2.0.jarJxbean-spring_2.8.jarxirs-anznotitifrns-1.2.6.jsr_stfirej6.jfiaraijtfire-jsrl81-ap.i-l,0-N1,jirmfire-xmlbe-ans-l,2.6.jar在WEB-INF目录下新建目录META-INF在该目录下新建文件夹xfire,该目录下新建文件services.xmlBankingnamespacemyb
13、ankcom.mybank.xfire.example.IBankingServicecom.mybank.xfire.impl.BankingService第五步,发布,部署到服务器,访问url:http:/localhost:9080/Xfire/services/Banking?wsdl3. AXIS2 方式Axis2发布WebService有两种方式,其一是利用axis2插件打成aar包放到axis_war里面部署到服务器发布;其二是不打包发布(本例);我不清楚打包发布有什么好处,感觉很麻烦项目外还得部署一个war,现在介绍第二种不打包的方式,类似xfire,同时由于cxf与was不兼
14、容导致wsdl.jar报错,但是xfire与axis2也用到wsdl.jar却不报错,我个人也是很费解,泰康项目目前使用的就是axis2方式。Axis2发布WebService:第一步,添加jar包,如下:很多是吧,不过都是从axis.war里面WEB-INF下白lib目录复制来的。第二步,修改web.xml文件AxisServletorg.apache.axis2.transport.http.AxisServletlass1AxisServlet/services/*in一曲.1.0jaf一a-btlr-2T.T-jiu-mon-L_1E7jsroxiicrrf.-7.jisa-n-4X:
15、l史, 中看$/4电鼬=LI.L.事4J.ju,_网rbsrL.】明修口色1.4LJU_4.L.肛OotasE-jucbru_L4.Ltz/z-l.-fl.1jarIHJ金.jam-即174.【.jr_4L.jurai33Z_jEMi-J.4-L.jariZi-sS-jjE-ji-14JiT士awLs2-tErz.el-l.L.JOT工ULbtwdwt-A.-!dLj拉wIsZrig-1.-L.L.jsHaj-lA1j-sr34L,jr1Kls苫jirin丁14jIT4L,j=“出皿 7jw产iS.ji*F二,,CUInuJWiLltpiEl.LSiht1( (LJMJMrMKilTLlV.j
16、trBccrficais-lTiEiJiic-L1jar.2.4r*hiriP-MtintiCLL.jir:erwnri0-mnoitati.nn_tJ_sc-5CJ1jarjAraniiiia-ail_t曰二曰二Lp由由12jir3?er*n3rip_*lar-ai:i._l.0_Ept_1J.1jtrbi-4D-LalA!jirjt,Jkitpzore-jiiiv-l.D-btts.jartrijwEfc-spi-fi-L.jir出I二ait-iTFIT.1.6.jar二稣&-1产-2L6.jsrjJjiggErl-1J.jaT0-寓2jw311b.jwrL.&.ju目Wi
17、 isisaQnail4.1riwjnvX11.41ELtplJ4f当*启小飞.OL4.他JBSrcavticnjnt-4.L.J上iYnikn-ifi-J.。帕.juurodjtji-anpL-口出jariaw-aO4j12.jiriiizerctsInpl-Z.B.JL.jKJI3ril-ApL%-1.主况jarXTill:60=.5.3.D.j-ttrril-relTr-ltjwZrilch.-aiinl.441/servlet-c第三步,编写实现类publicclassServicelmplpublicStringsayHello(Stringname)System.out.print
18、ln(=);returnhello:+name;第四步,增加WEN-INF内容将axis.war解压下的WEN-INF文件夹内的conf、modules复制到项目WEB-INF下曰工5A-Kis2Tet白国src国田+1JKESystemLibrary:J:距市匚I由一JavaEE5Libraries翱H.bApplibru-iE+已META-IMF目号1+113conf+10lit+1(_ngdulsHservices|-:予AxLsETest面JMETA-I1WII.mHservices.xmljx,web.xmljJindcn.jap第五步,在WEB-INF下创建文件夹services(
19、名字不可改),在该目录下创建文件夹(名称随意),在该目录下创建文件夹META-INF(名称不可改),在该目录下创建文件services.xml(名称不可改),该文件内容为:WebService 例子com.ServiceImpl第六步,部署到服务器,发布URL为:http:/localhost:9080/Axis2Test/services/axisDemo?wsdl恤一工皿4. AXIS1 方式同上,不知道AXIS1哪里不好,配置也很简单,如下:第一步,添加jar包Mi activation.jir2015/2/101041EKScutable45KE,I_JaxiE.jar2006/4/2
20、210:56ExecutableJar.1,563KBpjant.jar2006/V2213:56EicecutabLf Jar33KJCpmmdiscovery-Qsjar2006/4/2213:56ExetqtableJsr-,rTOKBMiSTIS-1oggi元1.4.2006/4/2218.56J&F.38KBHjaxrpc.jur2006/4/22ie:5fiExecutableJar.31KB回log4j_1.2.8.jar2C06/4/22ExecutableJsr.345KB画mi&il.jar2015/2/101041mutableJAF347KBsaaij,
21、jar2006/4/2213:56EKecutableJsr一19KBd wsd14jl.5.1.jar2006/4/2218:56ExtentableJH.-124KD第二步,修改web.xmlAxisServletorg.apache.axis.transport.http.AxisServletAxisServlet/services/*第三步,实现类与实体类实现类:packagecom;publicclassAxispublicStringsayHello(Stringname)System.out.println(=:+name);returnhi:+name;publicStrin
22、gsayHelloToUser(Useru)System.out .println(一:+u.getId();System.out .println(-:+u.getPath();System.out .println(-:+u.getAdd();returnhi:+u.getName();)实体类:packagecom;publicclassUserprivateStringid;privateStringname;privateStringadd;privateStringpath;gettersetter方法第四步,创建配置文件:在WEB-INF下新建文件“server-config.w
23、sdd!-globalConfiguration标签内容为系统默认无需更改!-service标签是需要配置的-!-name 是 url 中需要的参数-!三 llowedMethods 的 value 值是方法名可以写*-!-className 的 value 值是类路径-!wsdlTargetNamespace 的 wsdl 文件中 TargetNamespace 的值-!T 匕处很重要,若方法需要传实体类,则配置此处-!认-第五步,部署,同上。5. AXIS1 客户端调用此处调用方式为axisl的调用,需要传递的参数可以是字符串或实体类,字符串方式:Serviceservice=newSer
24、vice();Callcall=(Call)service.createCall();/wsdl 地址call.setTargetEndpointAddress(newURL(wsdlUrl);/设定调用 3 分钟不返回则超时call.setTimeout(newInteger(180000);/命名空间(wsdl 文件中的 targetNameSpace 属性值)以及方法名call.setOperationName(newQName(http:/com,sayHello);/参数类型call.addParameter(name,XMLType.XSD_STRING,ParameterMode
25、.IN);/返回值类型call.setReturnType(XMLType.XSD_STRING);/参数值StringretXML2=(String)call.invoke(newObjectyczhang);System.out.println(retXML2);实体类方式(调用axis2的接口有点问题):UserEntityuserEntry=newUserEntity();userEntry.setId(yczhang);userEntry.setName(yczhang);Serviceservice=newService();Callcall=(Call)service.creat
26、eCall();/wsdl 地址call.setTargetEndpointAddress(/设定调用 3 分钟不返回则超时/命名空间(wsdl 文件中的 targetNameSpace 属性值)以及方法名call.setOperationName(newQName(http:/com,sayHelloToUser/注册 SimpleObject 的序列化类型QNameqn=newQName(urn:BeanService,UserEntity);call.registerTypeMapping(UserEntity.BeanSerializerFactory(UserEntity.BeanD
27、eserializerFactory(UserEntity./参数类型(可省略)call.addParameter(requestParamorg.apache.axis.encoding.XMLType/返回值类型call.setReturnType(XMLType.XSD_BOOLEAN);BooleanretXML1=(Boolean)call.invoke(newObjectSystem.out.println(retXML1);newURL(wsdlUrl);call.setTimeout(newInteger(180000););class,qn,newclass,qn),newc
28、lass,qn);,.XSD_ANYTYPE,ParameterMode.IN);userEntry);注意,实体类方式,当调用的是由axis2方式所发布的接口时,容易出现问题,表现在所传递的实体类的属性内容为null,但在该实体类内新建一属性传如该值时,却有值。应该是axisl对axis2的不兼容问题。并且调用axis2的接口时,需要在客户端写出namespace,即:/call.setOperationName(newQName(http:/localhost:9080/WS_Axis/services/axisTest,sayHelloToUser);该种调用方式对于axis1的接口没问
29、题。泰康项目最终使用的是axis1发布的接口,并使用该种方式调用的。publicstaticvoidmain(String口args)throwsServiceException,MalformedURLException,RemoteExceptionStringwsdlUrl=http:/localhost:9080/WS_Axis/services/axisTest?wsdl;/实体类Useruser=newUser();user.setId(1);user.setAdd(test);user.setName(test);user.setPath(test);Serviceservice
30、=newService。;Callcall=(Call)service.createCall();call.setTargetEndpointAddress(newURL(wsdlUrl);/设定调用 3 分钟不返回则超时 call.setTimeout(newInteger(180000);/call.setOperationName(newQName(http:/localhost:9080/WS_Axis/services/axisTest,sayHelloToUser);/注册 SimpleObject 的序列化类型(urn:BeanService 在 wsdd 文件内有配置)QNam
31、eqn=newQName(urn:BeanService,User);call.registerTypeMapping(User.class,qn,newSystem.out.println(call.invoke(6. AXIS2 客户端调用所需jar包:BeanSerializerFactory(User.BeanDeserializerFactory(User./方法名call.setOperationName(class,qn),newclass,qn);sayHelloToUser);/“user”是接口服务端方法体中的实体类所声明的变量名(call.addParameter(use
32、r,say(Useruser)”)org.apache.axis.encoding.XMLType./返回值类型call.setReturnType(XMLType.XSD_ANYTYPE,ParameterMode.IN);XSD_STRING);newObjectuser);叵amwgenrOL1.09jar2D15/2/610:01EsecutableJar.,2曲KB2.7.jar2015/2/610:01EsecutableJar.195KB|IA|=ipl-l,2,jar2035/2/610-01EKJar.124KBiIaxi玄dbL4.1.jar201S/2/610/1Exec
33、utableJax.TSOKB产;axi.4-1sj2015/2/61O:D1EKautablJw-lf283KB巴ba-ckfiort-ntilcoTicnrrent_3.1.jar2015/2/610:01EMScutalbl咆Jar.一五4KB巴conwnons-coe1.3Sjar2015/2/61001Esieut&bl*JftT.46KB回Ljar2015/1/6to-oiE桀电uutbd世J红298KBoggiri,015/2/610:01IsiecutableJ虹一SOKB0.4.jarXiB/i/Am;otEsctcutJar.33KB6.2jar2C1
34、5/2/610.01EKecutaibleJar.14SKB三Jwi*sl-3a2.4.jar2035/2/61001Extentable114r.5比KB国XmlScheiia-!.4.2.jar2015W610:01EsecutableJar.一137KB具体代码:publicclassRPClientpublicstaticvoidmain(String口args)throwsAxisFaulttry/实体类UserEntityue=newUserEntity();ue.setId(123);ue.setAddress(test);ue.setMail(123);ue.setName(y
35、czhang);RPCServiceClientclient=newRPCServiceClient();Optionsoptions=client.getOptions();Stringurl=http:/localhost:9080/WS_Axis2/services/axisDemo?wsdlEndpointReferenceend=newEndpointReference(url);options.setTo(end);Object口obj=newObjectue;Class口classes=newClassBoolean.class;/命名空间方法名QNameqname=newQNa
36、me(http:/com,sayHelloToUser);System.out.println(client.invokeBlocking(qname,obj,classes)0);catch(AxisFaulte)e.printStackTrace();)注意该种方式缺点是客户端实体类路径即包名必须与服务端实体类路径相同!!但该方式可以调任何方式编写的接口!7. CXF 客户端调用使用axis、axis2客户端调用cxf接口会有问题,建议使用cxf自身客户端调用或者使用webserviceClient自动生成客户端方式所需的jar包:匚comiftons-logsiiis:.jar2015/2/514:39ExecutableJar.36KB-,CKf-2.2.1.jar2013/3722 1956Ex&cutbleJ虹.一435&KB_i2,Ljar2013/3/2219:58ExtestableJar.aaKB-Jjaxb_impl_2.1.9.jar2013/9722 19:58
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程保修的处理方案(3篇)
- 安全教育年度培训计划课件
- 安全教育平台培训考核课件
- 农业废弃物资源化利用在2025年的技术创新动态报告
- 安全教育培训骗人课件
- 安全教育培训途径课件
- 农业产业园项目农产品质量安全监管体系可行性研究与2025年效益评估报告
- 农业产业园项目农业科技成果转化与2025年经济效益评估报告
- 安全教育培训课件案例
- 2025年新能源社区智能微电网技术创新与应用案例深度解析报告
- 2025深入贯彻中央八项规定精神学习教育测试题和答案
- 医生进基层活动方案
- 2025-2030年中国蔬果保鲜剂行业市场深度调研及发展趋势与投资价值评估研究报告
- 2025年中国卡通公仔相机行业市场调查与发展研究报告
- 云南省土地征收农用地转用审批管理细则 (2023年修订)
- 2024年长庆油田分公司招聘考试真题
- 药剂知识竞赛试题及答案
- 尊师重教主题班会教案
- 医院质量与安全管理委员会制度职责及工作流程
- 幼儿园获奖公开课:中班数学《2和3的组成和分解》课件
- 数字化环境下航空装备研制质量管理的思考
评论
0/150
提交评论