使用Eclipse自动生成Soap Client的代码

在项目按右键,选择New -> Other ->Web Services -> Web Service Client,进入向导。

加入自有代码,例如加入Envelope Header

在xxxxStub.java文件相应的方法中加入:

public com.example.api.ApiStatus.EchoResponse echo(com.example.api.ApiStatus.Echo echo) throws java.rmi.RemoteException {if (super.cachedEndpoint == null) {throw new org.apache.axis.NoEndPointException();}org.apache.axis.client.Call _call = createCall();_call.setOperation(_operations[0]);_call.setUseSOAPAction(true);_call.setSOAPActionURI("");_call.setEncodingStyle(null);_call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);_call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);_call.setOperationName(new javax.xml.namespace.QName("", "echo"));setRequestHeaders(_call);setAttachments(_call);//这里是加入的Header的内容SoapUtils.addAuthSoapHeader(_call);
try {    。。。。。。
public class SoapUtils {private static final Logger log = LogManager.getLogger();private static SOAPFactory soapFactory;static{try {soapFactory = SOAPFactory.newInstance();} catch (SOAPException e) {log.fatal("[FATAL] create SOAP Factory error : {}",e.toString());}}//参考http://blog.csdn.net/oscar999/article/details/40340819private static SOAPHeaderElement createDcpSoapHeader(String userName, String password){try {String AUTH_PREFIX = "wsse";String AUTH_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";SOAPElement wsSecHeaderElm = soapFactory.createElement("Security", AUTH_PREFIX, AUTH_NS);SOAPElement userNameTokenElm = soapFactory.createElement("UsernameToken", AUTH_PREFIX, AUTH_NS);SOAPElement userNameElm = soapFactory.createElement("Username", AUTH_PREFIX, AUTH_NS);SOAPElement passwdElm = soapFactory.createElement("Password", AUTH_PREFIX, AUTH_NS);userNameElm.addTextNode(userName);passwdElm.addTextNode(password);userNameTokenElm.addChildElement(userNameElm);userNameTokenElm.addChildElement(passwdElm);wsSecHeaderElm.addChildElement(userNameTokenElm);SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(wsSecHeaderElm);soapHeaderElement.setMustUnderstand(true);return soapHeaderElement;} catch (Exception e) {return null;}}public static void addAuthSoapHeader(org.apache.axis.client.Call call,String userName, String password){SOAPHeaderElement header = createDcpSoapHeader(userName,password);if(header != null)call.addHeader(header);}
}

更好的方式还可以参考 Web Service SOAP Client 设置 SOAP Header,那里给出更通用的解决方式,而这里需要对每个接口都进行设置。主要是了解一下soap client的代码。

网络出现问题,多次重发的实现

利用Java的Function类,在SoapUtils实现通用的多次重发方法。

public class SoapUtils {private static final Logger log = LogManager.getLogger();......//在log上显示错误,并判断是否因为网络连接问题而需要重复public static boolean showAndCheckRetryEAxisFault(Exception e){if( e instanceof ConnectException)return true;if( e instanceof AxisFault){AxisFault fault = (AxisFault)e;if(fault.getFaultString().startsWith("java.net.ConnectException"))return true;log.error( fault.dumpToString());return false;}return false;}//在log上显示错误   public static void showAxisFault(Exception e){      if( e instanceof AxisFault){AxisFault fault = (AxisFault)e;log.error( fault.dumpToString());}      }// 根据重复后退的retriesDelay参数,在网络出现故障时,进行重复。其中SoapUtils.ThrowingFunction<T, R> func就是soap proxy中的具体某个方法。这个func因为抛出异常,不能直接使用Function<T,R>,需要通过ThrowingFunction<T,R> extends Function<T,R>来实现。public static <T, R> R funcApplyWithThrow(SoapUtils.ThrowingFunction<T, R> func,T param, Long ... retriesDelay) throws AxisFault,Exception{     if(retriesDelay != null){for(int i = 0 ; i< retriesDelay.length ; i ++){ try {return func.applyThrows(param);} catch (Exception e) {                 if(!SoapUtils.showAndCheckRetryEAxisFault(e))throw e;log.debug("Try to fix {}, resend({}) after {}ms", e.toString(), i+1, retriesDelay[i]);  }       NormalUtils.sleep(retriesDelay[i]);         }}try{return func.applyThrows(param);}catch(Exception e){SoapUtils.showAxisFault(e);throw e;}       }   //参考slieb.org/blog/throwable-interfaces/@FunctionalInterfacepublic static interface ThrowingFunction<T,R> extends Function<T,R> {@Overridedefault R apply(T t){try{return applyThrows(t);}catch (RemoteException e){throw new RuntimeException(e);}}R applyThrows(T t) throws RemoteException;}
}

具体某个重发的实现:

private final MySoapProxy proxy = new MySoapProxy(url);@Override
public QueryResponse query(Long ...retriesDelay) throws AxisFault,Exception{ QueryParam param = new QueryParam();return SoapUtils.funcApplyWithThrow(proxy::query, param, retriesDelay);
}

相关链接:我的Professional Java for Web Applications相关文章

Java for Web学习笔记(一一八):【篇外】Soap client相关推荐

  1. Java for Web学习笔记(六七):Service和Repository(2)抽象分层例子

    小例子说明 Spring提供了很好的架构和很方便的工具,在作为工具使用的同时,也应注意正确使用spring的架构,虽然不是强制的,但是这是spring的精髓.用spring,也要用spring的框架. ...

  2. Java for Web学习笔记(三五):自定义tag(3)TLDS和Tag Handler

    JSTL的TLD 这是JSTL采用的方式.TLD(Tag Library Descriptor)描述tag和function,以及具体执行的java代码tag handler.Tag Handler是 ...

  3. Java for Web学习笔记(一零八):再谈Entity映射(1)数据转换

    timestamp或datetime的匹配 存放毫秒 在数据库中缺省的精度为秒,如果需要存放毫秒甚至更好,可以如下: CREATE TABLE Ticket (TicketId BIGINT UNSI ...

  4. Cty的Linux学习笔记(八)

    Linux学习笔记--第八篇 命令(command): groupadd: 新增组的命令 格式:groupadd [-g GID] groupname 不加-g,按照系统默认的gid创建组,gid也是 ...

  5. java web学习笔记(持续更新)

    java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...

  6. 2019年Java Web学习笔记目录

    Java Web学习笔记目录 1.Java Web学习笔记01:动态网站初体验 2.Java Web学习笔记02:在Intellij里创建Web项目 3.Java Web学习笔记03:JSP元素 4. ...

  7. Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM

    原 Python3<机器学习实战>学习笔记(八):支持向量机原理篇之手撕线性SVM 置顶 2017年09月23日 17:50:18 阅读数:12644 转载请注明作者和出处: https: ...

  8. Java学习笔记之基础篇

    Java学习笔记之基础篇 目录 Java如何体现平台的无关性? 面向对象(OO)的理解 面向对象和面向过程编程的区别 面向对象三大特征 静态绑定和动态绑定(后期绑定) 延伸:类之间的关系 组合(聚合) ...

  9. hadoop学习笔记(八):Java HDFS API

    hadoop学习笔记(八):Java HDFS API 阅读目录 一.使用HDFS FileSystem详解 回到顶部 一.使用HDFS FileSystem详解 HDFS依赖的第三方包: hadoo ...

最新文章

  1. 常用的js验证数字,电话号码,传真,邮箱,手机号码,邮编,日期
  2. DroidPilot V2.1 手写功能特别版
  3. 这是我的C语言入门笔记。
  4. buf generate Failure: failed could not find protoc plugin for name go 解决方法
  5. 谷歌跨界医学新动作:基因突变定位模型又更!新!了!
  6. STL--deque用法
  7. 积分公式和常用方法总结
  8. oppo 小米,vivo等手机获取root方法,绝对可靠
  9. json转数组(json数组对象)
  10. 深度应用驱动的医学知识图谱构建(一)
  11. Gitee更新代码提示:master has no tracked branch
  12. 【模拟电子技术Analog Electronics Technology 6】—— 共射放大电路的原理与改进
  13. Technica:以太网解决方案
  14. 身份证读卡器 护照阅读器,如何能做到读取多证件呢?
  15. background系列属性
  16. PHP是世界上最好语言吗?
  17. Python学习记录 helloPython
  18. Windows运行程序时桌面窗口卡死
  19. sharepoint文件夹本地同步_急人!在家急用办公资料,其实win10系统自带多台电脑同步功能...
  20. 地图与WebGIS、地图的作用、数字地图的应用

热门文章

  1. 21天学习挑战赛——Python爬虫 lxml库与Xpath提取网页数据
  2. 51单片机c语言定时器程序,51单片机定时器设置入门与程序解析
  3. 盘点只读压缩文件系统
  4. COVID-19 对各年龄的影响分析
  5. On-chip Variations
  6. huffman编码的程序流程图_Huffman编码软件实现.doc
  7. 怎么用计算机直接截图,电脑怎么截图?教你几招方法
  8. CATIA操作经典技巧问答
  9. 无理数的近似值与连分数matlab,连分数 - it610.com
  10. P2370 yyy2015c01的U盘