




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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方式,下文会介绍。该问题在此处做个记录,以后使用cxf与was的时候需要注意!使用cxf+spring搭建WebService:第一步,添加jar包。此处需要注意,不同环境(tomcat、was)jar也不一定相同,例如我本地cxf+spring只需要如下jar包:而泰康的was环境则需要如下jar包:明显的多了很多,原因应该是服务器jar包池的不同。根据错误提示缺什么补什么就可以了,注意jar包勿重复。第二步,配置web.xml文件,如下(重要的地方已标记):contextConfigLocationclasspath:/applicationContext.xml org.springframework.web.context.ContextLoaderListener encodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encodingFilter/* CXFServlet org.apache.cxf.transport.servlet.CXFServlet 1 CXFServlet /webservice/* 上述标记的地方,第一处是spring配置文件路径;第二出是wsdl地址内容;第三步,编写接口类与实现类,注意注解接口类WebServicepublic interface SendService public boolean sendOA(WebParam(name=param)String param);public boolean sendOrg(OrgEntity org);实现类WebService(endpointInterface=com.service.SendService,serviceName=sendService)public class SendServiceImpl implements SendServicepublic boolean sendOA(String param) System.out.println(-sendOA-param:+param);if(param.equals(zhoujian)return true;return false;public boolean sendOrg(OrgEntity org) System.out.println(-sendOrg-begin-);return true;第四步,Spring配置文件 !- -“jaxws:client”该标签可以不必写,访问时可以手动拼接该url第五步,发布,直接部署到服务器,访问:1:9080/Wb/webservice/sendServie?wsdl2. Xfire方式据说xfire方式已经很老了,但个人感觉,xfire方式很简单且容易配置,不知为啥过时了,也没感觉cxf、axis2哪里先进,我当时卡在cxf与was搞不定时想尝试xfire方式被周经理给拒绝了。Xfire方式发布webservice:第一步,添加jar包,如下:第二步,修改web.xml文件 XFireServlet org.codehaus.xfire.transport.http.XFireConfigurableServlet 0 XFireServlet /services/* 第三步,编写接口类接口类:public abstract interface IBankingService public abstract String transferFunds(String paramString1);实现类:public class BankingService implements IBankingService public String transferFunds(String fromAccount) return fromAccount+:ok; 第四步,编写services.xml配置文件在WEB-INF目录下新建目录META-INF,在该目录下新建文件夹xfire,该目录下新建文件services.xmlBankingmybankcom.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不兼容导致wsdl.jar报错,但是xfire与axis2也用到wsdl.jar却不报错,我个人也是很费解,泰康项目目前使用的就是axis2方式。Axis2发布WebService:第一步,添加jar包,如下:很多是吧,不过都是从axis.war里面WEB-INF下的lib目录复制来的。第二步,修改web.xml文件 AxisServlet org.apache.axis2.transport.http.AxisServlet 1 AxisServlet /services/* 第三步,编写实现类public class ServiceImpl public String sayHello(String name)System.out.println(=);return hello:+name;第四步,增加WEN-INF内容将axis.war解压下的WEN-INF文件夹内的conf、modules复制到项目WEB-INF下第五步,在WEB-INF下创建文件夹services(名字不可改),在该目录下创建文件夹(名称随意),在该目录下创建文件夹META-INF(名称不可改),在该目录下创建文件services.xml(名称不可改),该文件内容为: Web Service例子 com.ServiceImpl 第六步,部署到服务器,发布URL为:http:/localhost:9080/Axis2Test/services/axisDemo?wsdl4. AXIS1方式同上,不知道AXIS1哪里不好,配置也很简单,如下:第一步,添加jar包第二步,修改web.xml AxisServlet org.apache.axis.transport.http.AxisServlet AxisServlet /services/* 第三步,实现类与实体类实现类:package com;public class Axis public String sayHello(String name)System.out.println(=:+name);return hi:+name;public String sayHelloToUser(User u)System.out.println(=:+u.getId();System.out.println(=:+u.getPath();System.out.println(=:+u.getAdd();return hi:+u.getName();实体类:package com;public class User private String id;private String name;private String add;private String path; getter setter 方法第四步,创建配置文件:在WEB-INF下新建文件“server-config.wsdd” !- globalConfiguration 标签内容为系统默认 无需更改 !service 标签是需要配置的 -!name 是url中需要的参数 - !allowedMethods 的value值是方法名 可以写*- !className的value值是类路径- !wsdlTargetNamespace的wsdl文件中TargetNamespace的值- !此处很重要,若方法需要传实体类,则配置此处- !默认- 第五步,部署,同上。5. AXIS1客户端调用此处调用方式为axis1的调用,需要传递的参数可以是字符串或实体类,字符串方式:Service service = new Service();Call call = (Call) service.createCall();/wsdl地址call.setTargetEndpointAddress(new URL(wsdlUrl);/设定调用3分钟不返回则超时call.setTimeout(new Integer(180000);/命名空间(wsdl文件中的targetNameSpace属性值) 以及方法名call.setOperationName(new QName(http:/com, sayHello);/参数类型call.addParameter(name, XMLType.XSD_STRING, ParameterMode.IN);/返回值类型call.setReturnType(XMLType.XSD_STRING);/参数值String retXML2 = (String) call.invoke( new Object yczhang );System.out.println( retXML2);实体类方式(调用axis2的接口有点问题):UserEntity userEntry = new UserEntity();userEntry.setId(yczhang);userEntry.setName(yczhang);Service service = new Service();Call call = (Call) service.createCall();/wsdl地址call.setTargetEndpointAddress(new URL(wsdlUrl);/设定调用3分钟不返回则超时call.setTimeout(new Integer(180000);/命名空间(wsdl文件中的targetNameSpace属性值) 以及方法名call.setOperationName(new QName(http:/com, sayHelloToUser);/注册SimpleObject的序列化类型QName qn = new QName(urn:BeanService, UserEntity);call.registerTypeMapping(UserEntity.class, qn, new BeanSerializerFactory(UserEntity.class, qn), new BeanDeserializerFactory(UserEntity.class, qn);/参数类型(可省略)call.addParameter(requestParam, org.apache.axis.encoding.XMLType.XSD_ANYTYPE, ParameterMode.IN);/返回值类型call.setReturnType(XMLType.XSD_BOOLEAN);Boolean retXML1 = (Boolean) call.invoke( new Object userEntry );System.out.println( retXML1);注意,实体类方式,当调用的是由axis2方式所发布的接口时,容易出现问题,表现在所传递的实体类的属性内容为null,但在该实体类内新建一属性传如该值时,却有值。应该是axis1对axis2的不兼容问题。并且调用axis2的接口时,需要在客户端写出namespace,即:/call.setOperationName(new QName(http:/localhost:9080/WS_Axis/services/axisTest, sayHelloToUser);该种调用方式对于axis1的接口没问题。泰康项目最终使用的是axis1发布的接口,并使用该种方式调用的。public static void main(String args) throws ServiceException, MalformedURLException, RemoteException String wsdlUrl = http:/localhost:9080/WS_Axis/services/axisTest?wsdl;/实体类User user = new User();user.setId(1);user.setAdd(test);user.setName(test);user.setPath(test);Service service = new Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(new URL(wsdlUrl); /设定调用3分钟不返回则超时call.setTimeout(new Integer(180000);/call.setOperationName(new QName(http:/localhost:9080/WS_Axis/services/axisTest, sayHelloToUser);/注册SimpleObject的序列化类型(urn:BeanService在wsdd文件内有配置)QName qn = new QName(urn:BeanService, User);call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn); /方法名call.setOperationName(sayHelloToUser); /“user”是接口服务端方法体中的实体类所声明的变量名(”say(User user)”)call.addParameter(user, org.apache.axis.encoding.XMLType.XSD_ANYTYPE, ParameterMode.IN);/返回值类型call.setReturnType(XMLType.XSD_STRING);System.out.println( call.invoke( new Object user );6. AXIS2客户端调用所需jar包:具体代码:public class RPClient public static void main(String args) throws AxisFault try /实体类UserEntity ue = new UserEntity();ue.setId(123);ue.setAddress(test);ue.setMail(123);ue.setName(yczhang);RPCServiceClient client = new RPCServiceClient();Options options = client.getOptions();String url = http:/localhost:9080/WS_Axis2/services/axisDemo?wsdl;EndpointReference end = new EndpointReference(url);options.setTo(end);Object obj = new Object ue ;Class classes = new Class Boolean.class ; /命名空间 方法名QName qname = new QName(http:/com, sayHelloToUser);System.out.println(client.invokeBlocking(qname, obj, classes)0); catch (AxisFault e) e.printStackTrace();注意 该种方式缺点是客户端实体类路径即包名必须与服务端实体类路径相同!但该方式可以调任何方式编写的接口!7. CXF客户端调用使用axis、axis2客户端调用cxf接口会有问题,建议使用cxf自身客户端调用或者使用webservice Client 自动生成客户端方式所需的ja
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年机器人操作员初级面试题集
- 2025年食堂会计招聘考试题集
- 2025年安全生产安全评价50题及答案
- 2025年安全员考试安全生产知识题库
- 2025年爆破员安全员技能考核题集
- 2025年宠物推拿AI师笔试模拟试卷
- 2025年无人机植保初级考试易错题解析
- 课件aoe教学课件
- 2025年宠物店宠物健康档案管理考试题
- 2025年导游笔试bi备冲刺题
- 扬州树人学校2024-2025七年级上学期9月月考数学试卷及答案
- 熔炼过程自动化智能化控制
- 郑州市第四中学英语新初一分班试卷含答案
- 《百变扭扭棒》大班艺术课件
- 2024年高考数学精准备考策略
- FZT 73013-2017 针织泳装行业标准
- 银行安全生产案例
- chemSHERPA CI:AI的制作方法说明资料
- 软件开发功能验收表
- 电力各种材料重量表总
- 完整版公司开户章程模板
评论
0/150
提交评论