spring WebServiceTemplate 调用 axis1.4 发布的webservice

  前言:

最近在开发中需要调用对方的 webservice服务,按照现有的技术,本应该是一件很简单的事情,只需要拿到wsdl文件,生成客户端代码即可,但是,对方的webservice服务是06年用axis1.4生成发布的,wsdl文件只能用zxis1.4生产客户端代码,而axis的jar包和程序部署环境WebSphere8.5冲突,导致程序无法启动。spring的WebServiceTemplate可以在was环境下使用,所以,写一下spring如何手动编写客户端代码,调用axis1.4的服务端。

解决方案:

不管用什么工具生成的webservice客户端,最终都组装为符合soap协议的xml文件发送给服务端,接收服务端返回的xml文件,解析成我们需要的对象。虽然spring无法根据axis1.4的wsdl文件生成客户端javaBean对象,但是我们可以根据spring由自己生产的javaBean对象如何组装soap协议xml文件的规则,反向手动编写这些javaBean,即:根据soap协议的xml文件反向推导出组装此xml文件的javaBean对象。

  1. 根据wsdl拿到要发送给服务端的xml文件,

这里根据wsdl的语法和soap协议规范,可以自己解析,但是比较费时,所以推荐一个工具:soapUI,可以根据wsdl文件生成要发送给服务端的xml文件以及对应服务端返回的xml文件(只是这个工具的一个小功能),本文用的soapUI版本是5.2.1

请求的xml文件实例:

1 <soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
2    <soapenv:Header/>
3    <soapenv:Body>
4       <sayHello soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
5          <message xsi:type="xsd:string">?</message>
6       </sayHello>
7    </soapenv:Body>
8 </soapenv:Envelope>

应答xml文件实例:

1 <soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
2    <soapenv:Header/>
3    <soapenv:Body>
4       <sayHelloResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
5          <sayHelloReturn xsi:type="xsd:string">?</sayHelloReturn >
6       </sayHelloResponse>
7    </soapenv:Body>
8 </soapenv:Envelope>

2. 根据xml编写javaBean

对应关系:请求报文中 Body标签内的 标签就是服务端方法的描述,

sayHello  -->  服务端的方法名  --> javaBean类 -->  @XmlRootElement 中的name的值

sayHello的子标签是方法的参数,后面定义了参数的类型

message --> 方法参数 --> javaBean的字段 --> @XmlElement 中的name的值

请求javaBean实例

 1 import javax.xml.bind.annotation.XmlAccessType;
 2 import javax.xml.bind.annotation.XmlAccessorType;
 3 import javax.xml.bind.annotation.XmlElement;
 4 import javax.xml.bind.annotation.XmlRootElement;
 5
 6 @XmlAccessorType(XmlAccessType.FIELD)
 7 @XmlRootElement(name = "sayHello")
 8 public class SayHelloRequest {
 9
10     @XmlElement(name = "message")
11     private String message;
12
13     public String getMessage() {
14         return message;
15     }
16
17     public void setMessage(String message) {
18         this.message = message;
19     }
20 }

应答javaBean实例

 1 import javax.xml.bind.annotation.XmlAccessType;
 2 import javax.xml.bind.annotation.XmlAccessorType;
 3 import javax.xml.bind.annotation.XmlElement;
 4 import javax.xml.bind.annotation.XmlRootElement;
 5
 6 @XmlAccessorType(XmlAccessType.FIELD)
 7 @XmlRootElement(name = "sayHelloResponse")
 8 public class SayHelloResponse {
 9
10     @XmlElement(name = "sayHelloReturn")
11     private String sayHelloReturn;
12
13     public String getSayHelloReturn() {
14         return sayHelloReturn;
15     }
16
17     public void setSayHelloReturn(String sayHelloReturn) {
18         this.sayHelloReturn = sayHelloReturn;
19     }
20 }

3. spring WebserviceTemplate调用

spring的WebserviceTemplate使用这里不做详解了,需要配置WebserviceTemplate的bean和解析xml文件的 Marshaller bean

 1 import javax.annotation.Resource;
 2
 3 public class WsTest {
 4
 5     @Resource
 6     private WebServiceTemplate webServiceTemplate;
 7
 8     public SayHelloResponse sayHello (SayHelloRequest request) {
 9
10         String url = "http://www.xxxx.com/xxx";
11
12          return (SayHelloResponse)webServiceTemplate.marshalSendAndReceive (url, request);
13     }
14
15 }

时间: 2024-10-13 16:18:55

spring WebServiceTemplate 调用 axis1.4 发布的webservice的相关文章

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

写在前面: 调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可:2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是axis,那么我在客户端也可以导入相应的axis的jar包,然后用它相关的方法来进行调用:3.js调用:4.URLConnection调用.上面的前两种方式个人认为比较适用于服务端与客户端都是java开发系统,如果是不同语言的调用那就不好说了.而第三种与第四种的方式其实差不多,如果在jsp页面中就要调

httpclient4.x调用cxf发布的webservice的某个方法(有参数,有返回值)(未整合spring)

原文:httpclient4.x调用cxf发布的webservice的某个方法(有参数,有返回值)(未整合spring) 源代码下载地址:httpclient4.x调用cxf发布的webservice的某个方法(有参数,有返回值)(未整合spring) 采用spring + cxf编写服务端 httpclient4编写客户端调用 如题,代码没有jar 完整包: 链接:http://pan.baidu.com/share/link?shareid=2162612373&uk=402880896 密

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

这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料 VS2013 WebService接口 方法/步骤 首先打开VS2013,选择文件->新建->项目.   在项目中选择[控制台应用程序],将项目名称重新命名为[WebServiceTest].   点击项目右键,选择添加->服务引用.   在地址栏中输入WebServie链接地址后回车,然后重新命

activiti designer源码的研究(三) 之servicetask调用除Java之后的其他语言发布的webservice

按照上一篇文章的配置,ServiceTask已经可以调用带有@webParam和@webResult发布的webservice了,但是怎么调用这些不带这些参数的发布的webservice了,因为其他语言并没有@webParam这些参数,请看下面的例子: Counter.java <span style="font-size:14px;">@WebService public interface Counter { /** * Increase the counter in

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

在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步测试了客户端传递数据给服务端. 因为相关的jar包在上一篇已经说过,因此便不再重复说明,这次的测试步骤如下: 一.测试向服务端传递字符串(重点在第二个): 为了进一步理解服务搭建,我重新写了一个服务端服务类: 接口: package xfireTest; public interface XFire

spring+cxf+hibernate&#160;&#160;发布restful&#160;WebService服务

项目目录结构 项目下载路径: http://pan.baidu.com/s/1o6H06LW   (如果项目路径实效,可以qq找我,下面有我qq) 1.we b.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.c

C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll C#调用、动态调用

1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图所示, 也可以在本地IIS根据webservice文件目录新发布一个webservice,然后程序动态调用,修改Url public new string Url { set; get; } 2.根据wsdl文件生成webservice 的.cs文件 及 生成dll C#调用   有时没有这么多文件

深入理解Spring的容器内事件发布监听机制

目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监听 4.Spring事件监听源码解析 4.1 初始化事件发布器流程 4.2 注册事件监听器流程 4.3 容器事件发布流程 5.总结 1. 什么是事件监听机制 在讲解事件监听机制前,我们先回顾下设计模式中的观察者模式,因为事件监听机制可以说是在典型观察者模式基础上的进一步抽象和改进.我们可以在JDK或

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService