前言:

最近在开发中需要调用对方的 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文件的对应规则。

  1. 根据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的更多相关文章

  1. 使用URLConnection调用axis1.4开发的webservice

    写在前面: 调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可:2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是a ...

  2. Axis2(7):将Spring的装配JavaBean发布成WebService

    在现今的Web应用中经常使用Spring框架来装载JavaBean.如果要想将某些在Spring中装配的JavaBean发布成WebService,使用Axis2的Spring感知功能是非常容易做到的 ...

  3. 带你走进EJB--将EJB发布为Webservice(2)

    在企业级的应用程序中经常都要把用不同语言写成的.在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量. 简单的一个例子:应用程序经常需要从运行在A主机上的程序中获取数据:或者把数据发送到 ...

  4. 解决cxf+spring发布的webservice,types,portType和message以import方式导入

    用cxf+spring发布了webservice,发现生成的wsdl的types,message和portType都以import的方式导入的.. 原因:命名空间问题 我想要生成的wsdl在同个文件中 ...

  5. xfire发布的Webservice中Spring注入为空的解决方案

    Spring框架使用中注入为空是一个比较头疼的问题,遇到Webservice和Spring框架配合时,这个问题更容易出现并很难发现问题的原因. 在做SSO系统中就遇到这样的问题,在Service的实现 ...

  6. Java调用IIS发布的WebService

    之前的一篇博客说了一个实例,就是用VS2005在IIS上发布WebService.今天我们来实现在Eclipse上用Java来调用昨天发布的WebService. 首先咋在浏览器中输入http://1 ...

  7. 在IIS上发布一个WebService,再发布一个网站调用这个WebService(实例)

    首先描述一下先决条件:IIS可用,VS2005可用. 好,现在开始: 首先写一个WebService并把它发布到IIS上: 在IIS上的默认网站下新建一个“虚拟目录”,取名为“webservice1” ...

  8. java程序调用xfire发布的webService服务(二)

    在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步 ...

  9. 如何调用别人发布的WebService程序

    这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料   V ...

随机推荐

  1. spring的annotation-driven配置事务管理器详解

    http://blog.sina.com.cn/s/blog_8f61307b0100ynfb.html ——————————————————————————————————————————————— ...

  2. Working with Other Node Types II

    [Working with Other Node Types II] An SKCropNode object does not directly render content, like a spr ...

  3. UVaLive 7512 November 11th (思维漏洞)

    题意:给定n*m个座椅,然后有b个是坏的,要做人,并且两个人不能相邻,问你最多坐多少人,最少坐多少人. 析:这个题其实并不难,只要当时一时没想清楚,结果就一直WA,就是最少的情况时,其实一个人可以占三 ...

  4. JDBC 常用驱动类及url格式

    1. oracle <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</ ...

  5. maven3实战之maven使用入门(使用archetype生成项目骨架)

    maven3实战之maven使用入门(使用archetype生成项目骨架) ---------- maven提供了archetype以帮助我们快速勾勒出项目骨架.以Hello World为例,我们使用 ...

  6. css 文字超出变 ... 点点点

    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;

  7. mvc api odata 查询选项之 $inlinecount ,$format 选项

    网上百度“odata 语法”会出来很多结果,其中有一项是比较一致的,那就是odata支持一下几种语法: $filter  条件表达式 -- 对应sql语句的where条件查询,如:/Categorie ...

  8. Unity学习笔记(一)——基本概念之场景(Scene)

    场景,顾名思义就是我们在游戏中所看到的物品.建筑.人物.背景.声音.特效等,基本上和我们玩游戏时所看到的游戏“场景”是同一个概念. Unity 3D中,“场景”是一个视图,我们通过“场景”这个视图,来 ...

  9. 71道经典Android面试题和答案

    ,,面试题1.        下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存  B.内存回收程序负责释放无用内存   C.内存回收程序允许程序员直接释放内存 ...

  10. Sublime Text 2 快捷键大全

    Ctrl+L 选择整行(按住-继续选择下行) Ctrl+KK 从光标处删除至行尾 Ctrl+Shift+K 删除整行 Ctrl+Shift+D 复制光标所在整行,插入在该行之前 Ctrl+J 合并行( ...