使用axis2解析sap发布的webService接口数据

  • 前语
    • 技术:axis2
    • 讲解:方法一
    • 讲解:方法二
    • 结语

前语

首先自我介绍,本人从事java开发,刚跳槽到了一家传统生产公司,主要负责公司的BI以及和sap对接的开发工作。为什么要写这篇微博呢?因为在网上找了好多关于解析wsdl(sap发布的webService的内容为wsdl),都于是无补,最后终于再茫茫的教程中完成了,与sap 对接的java开发。

技术:axis2

Axis框架来自 Apache 开放源代码组织,它是基于JAVA语言的最新的 SOAP 规范(SOAP 1.2)和 SOAP withAttachments 规范(来自 Apache Group )的开放源代码实现。有很多流行的开发工具都使用AXIS作为其实现支持Web服务的功能,能用到的地方有很多,本篇着重讲通过axis2解析webservice。

讲解:方法一

不多说,干货来了。
对于一般的webservice借口,使用axis2有两种方法。
1、 直接再maven里面添加依赖

<dependency><groupId>org.apache.axis2</groupId><artifactId>axis2</artifactId><version>1.6.2</version>
</dependency>
<dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-adb</artifactId><version>1.6.2</version>
</dependency>
<dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-transport-http</artifactId><version>1.6.2</version>
</dependency>
<dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-transport-local</artifactId><version>1.6.2</version>
</dependency>
<dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-kernel</artifactId><version>1.6.2</version>
</dependency>


这个是简单的通过门店编号(IKUNNR)查询门店是否存在。但这个会有一个弊端就是就是sap的webservice会出错。大概是wsdl格式不正确,所以无法解析,具体原因大家可以再网上找一下。

讲解:方法二

本方法是本人亲测有效,而且很方便。
通过使用axis2本地操作,将webservice接口自动生成java实例,将接口中的函数封装,拿过来直接可以使用。但是其中有几个坑,咱们一步一步来说。
一、下载 axis2,https://download.csdn.net/download/weixin_42482346/11110168.
可直接下载版本是1.7.9
打开是
二、设置环境变量 %AXIS2_HOME% value E:\axis2-1.7.9\axis2-1.7.9 然后再path中在后面添加%AXIS2_HOME%/bin;

三、开始解析
进入axis2的bin目录,在地址栏输入cmd,直接打开dos窗口,输入命令 wsdl2 -uri “webService接口” -p (webservice实例所在项目的路径) -o (在bin目录中的文件)
正常解析过程汇报log4j的错误,不用理睬。结束之后会在设置的路径里面发现两个java文件。

其中xxxStub.java是主要的接口类(重要),xxxHandler.java 是是解析类,不用理睬。
重点坑: 在解析命令中 -p 一定要是解析的实例所在你项目的路径。例如: com.test.SapDomain
那么这里就应该一字不差的,因为它在解析的过程中,自动将路径映射至实例中。如果要更改,你需要进入实例代码中,一个一个的改动。吃过亏,希望大家不要踩坑。

四、有了实例 ,按照java的套路肯定是需要相应的jar包,这个大家不用担心。axis2已经准备好了,在主目录中的lib目录中就有,可以直接copy到项目中。然后将实例复制到项目中相应的路径中。
重点坑:在lib中有个jar包gson-2.1.jar,如果不注意也拷贝进去,运行汇报 not found method。是因为java中已经有此类了,再加入项目可能导致版本冲突,而报错。若出现这个问题,可以将此jar报删掉。

五、代码编写。
需求:根据门店编号查询,门店在sap中是否存在。(入门)

@Testpublic void checkKunnrBySap() throws RemoteException {// TODO Auto-generated method stub//创建接口实例,此就是xxxStub包对象ZWEIXICHECKKUNNRStub stub = new ZWEIXICHECKKUNNRStub();//创建接口中函数的对象ZWEIXICHECKKUNNRStub.ZweixiCheckKunnr zweixiCheckKunnr = new ZWEIXICHECKKUNNRStub.ZweixiCheckKunnr();//创建参数对象,并扶植ZWEIXICHECKKUNNRStub.Char10 char10 = new ZWEIXICHECKKUNNRStub.Char10();char10.setChar10("1100");//给函数参数复制zweixiCheckKunnr.setIKunnr(char10);//接口实例嗲用函数,方法参数一般是已赋值的函数对象ZWEIXICHECKKUNNRStub.ZweixiCheckKunnrResponse response = stub.zweixiCheckKunnr(zweixiCheckKunnr);String char1 = response.getECode().getChar1();//输出System.out.println(char1);}

讲解一下参数的设定,因为sap对字段管控严格,且与java的数据类型的差异,只能通过接口中封装的方法来换类型。

需求:根据门店编号和日期,查询门店单据(进阶)
这个的难点在于sap的传回的数据的复杂性(为表结构)。
分为两部分,单据head和item。可以简单的看作为两个表(head表与item表),且head和item为一对多的关系。一个单据抬头对应多个行项目
head表

key value
单据编号 010
日期 2019-04-12
门店编号 1000
送货路线 上海-南京

item表

单据编号 产品编号 产品名 单价
010 2000 bbb 1111
010 10000 ccc 2222
010 3000 ddd 3333
010 4000 eee 444

重点:两张表中一点要有相同的字段,类似与sql的外键,可以让head与item表能对应。

知道了返回的参数模型,就知道该怎么对传回的数据进行解析了。以后遇到相同的sap结构也可以照搬。

不多说源码奉上
首先是单据对象delivery

import java.util.Date;
import java.util.List;public class SapDelivery {private String head_Vbeln;private String head_Lfdat;private String head_Kunnr;private String head_Zname;private String head_Zmdlx;private String head_Zmddz;private String head_Zmdxl;private String head_Zxsdq;private List<SapDeliveryItem> sapDeliveryItems;public String getHead_Vbeln() {return head_Vbeln;}public void setHead_Vbeln(String head_Vbeln) {this.head_Vbeln = head_Vbeln;}public String getHead_Lfdat() {return head_Lfdat;}public void setHead_Lfdat(String head_Lfdat) {this.head_Lfdat = head_Lfdat;}public String getHead_Kunnr() {return head_Kunnr;}public void setHead_Kunnr(String head_Kunnr) {this.head_Kunnr = head_Kunnr;}public String getHead_Zname() {return head_Zname;}public void setHead_Zname(String head_Zname) {this.head_Zname = head_Zname;}public String getHead_Zmdlx() {return head_Zmdlx;}public void setHead_Zmdlx(String head_Zmdlx) {this.head_Zmdlx = head_Zmdlx;}public String getHead_Zmddz() {return head_Zmddz;}public void setHead_Zmddz(String head_Zmddz) {this.head_Zmddz = head_Zmddz;}public String getHead_Zmdxl() {return head_Zmdxl;}public void setHead_Zmdxl(String head_Zmdxl) {this.head_Zmdxl = head_Zmdxl;}public String getHead_Zxsdq() {return head_Zxsdq;}public void setHead_Zxsdq(String head_Zxsdq) {this.head_Zxsdq = head_Zxsdq;}public List<SapDeliveryItem> getSapDeliveryItems() {return sapDeliveryItems;}public void setSapDeliveryItems(List<SapDeliveryItem> sapDeliveryItems) {this.sapDeliveryItems = sapDeliveryItems;}public SapDelivery(String head_Vbeln, String head_Lfdat, String head_Kunnr, String head_Zname, String head_Zmdlx, String head_Zmddz, String head_Zmdxl, String head_Zxsdq, List<SapDeliveryItem> sapDeliveryItems) {this.head_Vbeln = head_Vbeln;this.head_Lfdat = head_Lfdat;this.head_Kunnr = head_Kunnr;this.head_Zname = head_Zname;this.head_Zmdlx = head_Zmdlx;this.head_Zmddz = head_Zmddz;this.head_Zmdxl = head_Zmdxl;this.head_Zxsdq = head_Zxsdq;this.sapDeliveryItems = sapDeliveryItems;}public SapDelivery() {}
}

然后是item的实例对象

public class SapDeliveryItem {private String item_Vbeln;private String item_Posnr;private String item_Matnr;private String item_Maktx;private String item_Klmeng;private String item_Lgmng;private String item_Meins;private String item_Zghdj;private String item_Zghje;private String item_Zlsdj;private String item_Zlsje;public String getItem_Vbeln() {return item_Vbeln;}public void setItem_Vbeln(String item_Vbeln) {this.item_Vbeln = item_Vbeln;}public String getItem_Posnr() {return item_Posnr;}public void setItem_Posnr(String item_Posnr) {this.item_Posnr = item_Posnr;}public String getItem_Matnr() {return item_Matnr;}public void setItem_Matnr(String item_Matnr) {this.item_Matnr = item_Matnr;}public String getItem_Maktx() {return item_Maktx;}public void setItem_Maktx(String item_Maktx) {this.item_Maktx = item_Maktx;}public String getItem_Klmeng() {return item_Klmeng;}public void setItem_Klmeng(String item_Klmeng) {this.item_Klmeng = item_Klmeng;}public String getItem_Lgmng() {return item_Lgmng;}public void setItem_Lgmng(String item_Lgmng) {this.item_Lgmng = item_Lgmng;}public String getItem_Meins() {return item_Meins;}public void setItem_Meins(String item_Meins) {this.item_Meins = item_Meins;}public String getItem_Zghdj() {return item_Zghdj;}public void setItem_Zghdj(String item_Zghdj) {this.item_Zghdj = item_Zghdj;}public String getItem_Zghje() {return item_Zghje;}public void setItem_Zghje(String item_Zghje) {this.item_Zghje = item_Zghje;}public String getItem_Zlsdj() {return item_Zlsdj;}public void setItem_Zlsdj(String item_Zlsdj) {this.item_Zlsdj = item_Zlsdj;}public String getItem_Zlsje() {return item_Zlsje;}public void setItem_Zlsje(String item_Zlsje) {this.item_Zlsje = item_Zlsje;}public SapDeliveryItem(String item_Vbeln, String item_Posnr, String item_Matnr, String item_Maktx, String item_Klmeng, String item_Lgmng, String item_Meins, String item_Zghdj, String item_Zghje, String item_Zlsdj, String item_Zlsje) {this.item_Vbeln = item_Vbeln;this.item_Posnr = item_Posnr;this.item_Matnr = item_Matnr;this.item_Maktx = item_Maktx;this.item_Klmeng = item_Klmeng;this.item_Lgmng = item_Lgmng;this.item_Meins = item_Meins;this.item_Zghdj = item_Zghdj;this.item_Zghje = item_Zghje;this.item_Zlsdj = item_Zlsdj;this.item_Zlsje = item_Zlsje;}public SapDeliveryItem() {}
}

解析!!

@Testpublic void test3() {//存在门店有多个交货单,因此创建List容器List<SapDelivery> sapDeliveries = new ArrayList<>();try {//          获取接口实例ZSD_SEND_DN_TO_WCStub stu = new ZSD_SEND_DN_TO_WCStub();
//          获得接口中函数的实例ZSD_SEND_DN_TO_WCStub.ZsdSendDeliveryToWechat zsdSendDeliveryToWechat = new ZSD_SEND_DN_TO_WCStub.ZsdSendDeliveryToWechat();
//          设置参数ZSD_SEND_DN_TO_WCStub.Date10E date10E = new ZSD_SEND_DN_TO_WCStub.Date10E();date10E.setDate10("2019-03-31");ZSD_SEND_DN_TO_WCStub.Char10E char10E = new ZSD_SEND_DN_TO_WCStub.Char10E();char10E.setChar10("0000001100");
//          将参数传入函数中ZSD_SEND_DN_TO_WCStub.TableOfZsdSapToWechatHead tablehead = new ZSD_SEND_DN_TO_WCStub.TableOfZsdSapToWechatHead();ZSD_SEND_DN_TO_WCStub.TableOfZsdSapToWechatItem tableitem = new ZSD_SEND_DN_TO_WCStub.TableOfZsdSapToWechatItem();zsdSendDeliveryToWechat.setIDate(date10E);zsdSendDeliveryToWechat.setIKunnr(char10E);
//          将表对象也需要传入到函数里面zsdSendDeliveryToWechat.setEtHead(tablehead);zsdSendDeliveryToWechat.setEtItem(tableitem);
//            获取到响应对象ZSD_SEND_DN_TO_WCStub.ZsdSendDeliveryToWechatResponse response = stu.zsdSendDeliveryToWechat(zsdSendDeliveryToWechat);
//            分别获取到head数组对象,以及item数组对象ZSD_SEND_DN_TO_WCStub.ZsdSapToWechatHead[] heads = response.getEtHead().getItem();ZSD_SEND_DN_TO_WCStub.ZsdSapToWechatItem[] items = response.getEtItem().getItem();
//           同过内循环的方式对两个数组进行解析。(一对多)for (ZSD_SEND_DN_TO_WCStub.ZsdSapToWechatHead head : heads) {ArrayList<SapDeliveryItem> sitems = new ArrayList<>();SapDelivery sapDelivery = new SapDelivery(head.getVbeln().getChar10(),head.getLfdat().getDate10(),head.getKunnr().getChar10(),head.getZname().getChar30(),head.getZmdlx().getChar30(),head.getZmddz().getChar60(),head.getZmdxl().getChar25(),head.getZxsdq().getChar20(),sitems);for (ZSD_SEND_DN_TO_WCStub.ZsdSapToWechatItem item : items) {if (head.getVbeln().getChar10() .equals(item.getVbeln().getChar10()) ) {SapDeliveryItem sitem = new SapDeliveryItem(item.getVbeln().getChar10(), item.getPosnr().getNumeric6(), item.getMatnr().getChar18(), item.getMaktx().getChar40(), item.getKlmeng().toString(), item.getLgmng().toString(), item.getMeins().getUnit3(), item.getZghdj().toString(), item.getZghje().getCurr112().toEngineeringString(), item.getZlsdj().getCurr152().toEngineeringString(), item.getZlsje().getCurr112().toEngineeringString());sitems.add(sitem);}}sapDelivery.setSapDeliveryItems(sitems);sapDeliveries.add(sapDelivery);}System.out.println(sapDeliveries);} catch (Exception e) {e.printStackTrace();}}//采用的是内循环的方式将数据传入到集合里面,不管有多少的单据都可以一次性

解析结果:

[SapDelivery {head_Vbeln = '123123', head_Lfdat = 2019 - 03 - 31, head_Kunnr = '1231231', head_Zname = 'SFGDFFDD', head_Zmdlx = '公司间客户', head_Zmddz = '', head_Zmdxl = '', head_Zxsdq = '', sapDeliveryItems = [SapDeliveryItem {item_Vbeln = '123123', item_Posnr = '000010', item_Matnr = '123213123A', item_Maktx = '', item_Klmeng = '0.0', item_Lgmng = '0.0', item_Meins = '', item_Zghdj = '0.0', item_Zghje = '0.0', item_Zlsdj = '0.0', item_Zlsje = '0.0'}, SapDeliveryItem {item_Vbeln = '123123', item_Posnr = '000020', item_Matnr = '123213123B', item_Maktx = '', item_Klmeng = '0.0', item_Lgmng = '0.0', item_Meins = '', item_Zghdj = '0.0', item_Zghje = '0.0', item_Zlsdj = '0.0', item_Zlsje = '0.0'}]
}, SapDelivery {head_Vbeln = '123124', head_Lfdat = 2019 - 03 - 31, head_Kunnr = '1231232', head_Zname = 'SFGDFFFF', head_Zmdlx = '公司间客户', head_Zmddz = '', head_Zmdxl = '', head_Zxsdq = '', sapDeliveryItems = [SapDeliveryItem {item_Vbeln = '123124', item_Posnr = '000010', item_Matnr = '123213123C', item_Maktx = '', item_Klmeng = '0.0', item_Lgmng = '0.0', item_Meins = '', item_Zghdj = '0.0', item_Zghje = '0.0', item_Zlsdj = '0.0', item_Zlsje = '0.0'}, SapDeliveryItem {item_Vbeln = '123124', item_Posnr = '000020', item_Matnr = '1232131233D', item_Maktx = '', item_Klmeng = '0.0', item_Lgmng = '0.0', item_Meins = '', item_Zghdj = '0.0', item_Zghje = '0.0', item_Zlsdj = '0.0', item_Zlsje = '0.0'}, SapDeliveryItem {item_Vbeln = '123124', item_Posnr = '000030', item_Matnr = '123213123F', item_Maktx = '', item_Klmeng = '0.0', item_Lgmng = '0.0', item_Meins = '', item_Zghdj = '0.0', item_Zghje = '0.0', item_Zlsdj = '0.0', item_Zlsje = '0.0'}]
}]

以通过相同的Vbeln连接在一起,完成。

结语

过程中可能会因为自己的代码编写又或者是因为sap的问题,一定要冷静下来。也可以眼界xxxstub的接口类,里面还是有干货的。纯手打,若有语法错误,还望见谅。
最后第一篇文章到达了最后,希望能给大家带了点帮助。如果遇到了问题也可以留言或者私信,博主会不定时的为他家解决。最后,祝大家工作愉快。

通过axis2解析sap 发布的webService接口,新手到进阶,多种方法。相关推荐

  1. java使用axis调用.net发布的webservice接口返回对象类型

    本人在java中axis-1.4 调用 .net发布的webService接口 有问题欢迎各路大神讨论 !!! 1.1 基本类型 1.2 对象类型 1.3复杂对象类型(对象类中嵌套对象类) 返回基本类 ...

  2. C#获取WebService接口的所有可调用方法[WebMethod]

    C#获取指定的WebService接口的所有可调用方法,将其绑定的树图控件(TreeView)中,我们引用天气WebService服务为例,联网情况下均可用. PS:天气WeatherWebServi ...

  3. Android开发中调用Spring CXF整合发布的WebService接口为什么抛出异常错误?

    摘要:最近在协助同事搞Android调用WebService接口,再测试的过程中发现老师报错,经过baidu,google,终于解决了,现在记录一下: 一:错误信息: 2015-10-28 18:50 ...

  4. 使用axis2解析wsdl反向生成webservice客户端

    1. 至apache官网上下载axis2-1.5-bin.zip包,并解压至文件夹中. 2.在环境变量中设置好AXIS2_HOME属性,如下: 例如: 变量名:AXIS2_HOME 变量值:E:\Pr ...

  5. 解析网站发布系统利用ASP生成静态页面的方法

    1.WITH TEMPLET意思是,生成的页面架构将采用某个已设定的模板,在此之前我的一篇教程中介绍过,希望各位在看本教程之前对ASP采用模板应熟悉下. 2.ASP转变为HTML.不要我再说ASP转变 ...

  6. 基于CXF框架的webservice接口发布与调用

    目录 前言 正文 一,开发接口服务端(soap风格),接收SAP系统推送过来的数据 二,调用SAP提供的webservice接口(soap风格) 三,调用SRM系统提供的rest接口 四,接口调试工具 ...

  7. Java dom4j解析RESTFull风格发布的WebService的xml文件

    公司项目要求解析出RESTFull风格发布的WebService接口的所有请求方法,参数,参数类型,已经方法是返回类型,想来想去都不知道该怎么办,思来想去然后又研究RESTFull风格WebServi ...

  8. 【WebService笔记01】使用JWS实现WebService接口的发布和调用

    这篇文章,主要介绍如何使用JWS实现WebService接口的发布和调用. 目录 一.JWS实现WebService接口 1.1.JWS发布WebService接口 (1)编写接口 (2)编写实现类 ...

  9. 如何访问webService接口

    在上篇的文章中我们接触到如何来编写webService接口,这篇文章我们将讲述的是如何来访问webService接口 首先比如这样的一个接口:http://127.0.0.1:11111/weathe ...

  10. SAP 发布 REST 接口「实例」

    前言 SE24 创建 服务处理类,作为 IF_HTTP_EXTENSION 接口实现类 实现 IF_HTTP_EXTENSION~HANDLE_REQUEST 方法 - 进行数据处理 SICF 发布服 ...

最新文章

  1. docker存储结构解析
  2. 解决SQL server2005数据库死锁的经验心得
  3. element ui 批量删除之后动态更新列表_气象编程 | Python高效批量绘图方法
  4. Swing开发界面时的一个bug复盘
  5. iOS之深入解析如何使用Block实现委托方法
  6. 理解Shadow DOM
  7. 英雄联盟与人生奋斗的类比讨论
  8. 【AI视野·今日Robot 机器人论文速览 第十八期】Fri, 2 Jul 2021
  9. sed中支持变量的处理方法
  10. linux redis 简书,Linux | Redis
  11. Javascript鸡汤
  12. Idea新建项目和快捷键
  13. NBA球队实力聚类分析
  14. PLC可编程控制器、单片机开发应用及变频调速综合实训装置
  15. 游戏服务器redis mysql_redis服务器环境下mysql实现lnmp架构缓存
  16. MySQL索引及视图
  17. 手机测试Android模块,五个有用的Xposed模块,用于自定义您的Rooted Android手机 | MOS86...
  18. 贵州省计算机专业大学排名,贵州大学的计算机专业全国排名第几?
  19. Vb下调用Help文件 (转)
  20. spire.office,Spire.Office 5.3.7组件的最新版本

热门文章

  1. 数据可视化?不如用最经典的工具画最酷炫的图
  2. uni-app完整实现小程序获取用户信息
  3. 使用java实现数据库编程 第一章:数据库的设计
  4. MySQL常用的日期时间函数
  5. ccf中文期刊目录_37本!中国计算机学会CCF首次发布推荐中文科技期刊目录
  6. 技术大会值得参加吗?
  7. 【专利】实用新型专利设计模板
  8. matlab求带参数二重定积分,matlab二重定积分
  9. python 手机号码识别_python3库可以识别电话号码、姓名、电子邮件和地址
  10. 基于springboot的在线考试系统