spring WebServiceTemplate 调用 axis1.4 发布的webservice
前言:
最近在开发中需要调用对方的 webservice服务,按照现有的技术,本应该是一件很简单的事情,只需要拿到wsdl文件,生成客户端代码即可,但是,对方的webservice服务是06年用axis1.4生成发布的,wsdl文件只能用axis1.4生成客户端代码,而axis的jar包和程序部署环境WebSphere8.5冲突,导致程序无法启动。之前的测试中,spring的WebServiceTemplate可以在was环境下使用,所以,写一下spring如何手动编写客户端代码,调用axis1.4的服务端。
解决方案:
不管用什么工具生成的webservice客户端代码,最终都工具根据生产的代码组装为符合soap协议的xml文件发送给服务端,接收服务端返回的xml文件,解析成我们需要的对象。虽然spring无法根据axis1.4的wsdl文件生成客户端javaBean对象,但是可以先根据wsdl解析到要发送给服务端的 xml文件的格式,由xml文件反向推导出spring组装此xml文件的javaBean对象,所以重点就是如何根据wsdl解析出服务端需要的xml文件,和 spring javaBean和xml文件的对应规则。
根据wsdl拿到要发送给服务端的xml文件,
这里根据wsdl的语法和soap协议规范,可以自己解析,但是比较费时,所以推荐一个工具:soapUI,可以根据wsdl文件生成要发送给服务端的xml文件以及对应服务端返回的xml文件(只是这个工具的一个小功能),本文用的soapUI版本是5.2.1
请求的xml文件实例:
<soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
<soapenv:Header/>
<soapenv:Body>
<sayHello soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<message xsi:type="xsd:string">?</message>
</sayHello>
</soapenv:Body>
</soapenv:Envelope>
应答xml文件实例:
<soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sayHelloResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sayHelloReturn xsi:type="xsd:string">?</sayHelloReturn >
</sayHelloResponse>
</soapenv:Body>
</soapenv:Envelope>
2. 根据xml编写javaBean
对应关系:请求报文中 Body标签内的 标签就是服务端方法的描述,
sayHello --> 服务端的方法名 --> javaBean类 --> @XmlRootElement 中的name的值
sayHello的子标签是方法的参数,后面定义了参数的类型
message --> 方法参数 --> javaBean的字段 --> @XmlElement 中的name的值
请求javaBean实例
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; @XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "sayHello")
public class SayHelloRequest { @XmlElement(name = "message")
private String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}
应答javaBean实例
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; @XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "sayHelloResponse")
public class SayHelloResponse { @XmlElement(name = "sayHelloReturn")
private String sayHelloReturn; public String getSayHelloReturn() {
return sayHelloReturn;
} public void setSayHelloReturn(String sayHelloReturn) {
this.sayHelloReturn = sayHelloReturn;
}
}
3. spring WebserviceTemplate调用
spring的WebserviceTemplate使用这里不做详解了,需要配置WebserviceTemplate的bean和解析xml文件的 Marshaller bean
import javax.annotation.Resource;
public class WsTest {
@Resource
private WebServiceTemplate webServiceTemplate;
public SayHelloResponse sayHello (SayHelloRequest request) {
String url = "http://www.xxxx.com/xxx";
return (SayHelloResponse)webServiceTemplate.marshalSendAndReceive (url, request);
}
}
spring WebServiceTemplate 调用 axis1.4 发布的webservice的更多相关文章
- 使用URLConnection调用axis1.4开发的webservice
写在前面: 调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可:2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是a ...
- Axis2(7):将Spring的装配JavaBean发布成WebService
在现今的Web应用中经常使用Spring框架来装载JavaBean.如果要想将某些在Spring中装配的JavaBean发布成WebService,使用Axis2的Spring感知功能是非常容易做到的 ...
- 带你走进EJB--将EJB发布为Webservice(2)
在企业级的应用程序中经常都要把用不同语言写成的.在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量. 简单的一个例子:应用程序经常需要从运行在A主机上的程序中获取数据:或者把数据发送到 ...
- 解决cxf+spring发布的webservice,types,portType和message以import方式导入
用cxf+spring发布了webservice,发现生成的wsdl的types,message和portType都以import的方式导入的.. 原因:命名空间问题 我想要生成的wsdl在同个文件中 ...
- xfire发布的Webservice中Spring注入为空的解决方案
Spring框架使用中注入为空是一个比较头疼的问题,遇到Webservice和Spring框架配合时,这个问题更容易出现并很难发现问题的原因. 在做SSO系统中就遇到这样的问题,在Service的实现 ...
- Java调用IIS发布的WebService
之前的一篇博客说了一个实例,就是用VS2005在IIS上发布WebService.今天我们来实现在Eclipse上用Java来调用昨天发布的WebService. 首先咋在浏览器中输入http://1 ...
- 在IIS上发布一个WebService,再发布一个网站调用这个WebService(实例)
首先描述一下先决条件:IIS可用,VS2005可用. 好,现在开始: 首先写一个WebService并把它发布到IIS上: 在IIS上的默认网站下新建一个“虚拟目录”,取名为“webservice1” ...
- java程序调用xfire发布的webService服务(二)
在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步 ...
- 如何调用别人发布的WebService程序
这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料 V ...
随机推荐
- Spring中的BeanUtils与apache commons中的BeanUtils用法[1]
1. 前言 在开发过程中,经常遇到把要给一个bean的属性赋给另外一个bean.最笨的方法是每个属性都单独写一个,聪明的方法是应用反射写一个工具方法.考虑到这个需求基本每个程序员都会遇到,那么一定已经 ...
- poj 1273 Drainage Ditches(最大流)
http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Subm ...
- TdxAlertWindowManager右下角HINT显示控件
带爱像的右下角HINT显示,自动隐藏 function alterInfo: TdxAlertWindowManager;begin if not Assigned(Falter) then be ...
- linux运维工程师
本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具.我就大概列出这几方面,这样入门就基本没问题了 ...
- MEF(Managed Extensibility Framework)依赖注入学习
MSDN官方资料,并且微软还提供了SimpleCalculator sample学习样例 http://msdn.microsoft.com/en-us/library/dd460648(v=vs.1 ...
- JQuery点击收起,点击展开以及部分非空小验证
<tr> <td nowrap align="right" width="18%"> 解决方案: </td> <td ...
- 【百题留念】hdoj 1524 A Chess Game(dfs + SG函数应用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1524 #include<stdio.h> #include<cstring> ...
- Pyqt5.2.1生成的.ui文件转换成.py
cmd C:\>pyuic5 ui文件路径 -o 要生成的py文件路径 如下: C:\>pyuic5 c:\python33\lib\site-packages\pyqt5\uic\log ...
- Decode放在where条件后的新用法
今天遇到一种特殊情况的查询,在查询某表时,要通过判断其中一个字段的值再用其他字段作为条件查询,比如有3个字段 columnA,columnBm,columnC,columnA的值由两个——分别是0和1 ...
- table布局 height=100%无效分析
(从死了一次又一次终于挂掉的百度空间中抢救出来的,发表日期 2014-08-11) 原文链接:http://www.cnblogs.com/gaojun/archive/2012/05/07/2487 ...