使用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/40340819

private 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 func就是soap proxy中的具体某个方法。这个func因为抛出异常,不能直接使用Function,需要通过ThrowingFunction extends Function来实现。

public static R funcApplyWithThrow(SoapUtils.ThrowingFunction 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/

@FunctionalInterface

public static interface ThrowingFunction extends Function {

@Override

default 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);

}

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

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

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

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

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

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

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

  4. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  5. 拉勾网《32个Java面试必考点》学习笔记之十二------架构演进与容器技术

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  6. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  8. Java学习笔记之基础篇

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

  9. 【慕课网】Web学习笔记———CSS3 (一)

    [Web学习笔记]CSS3 (一) CSS3代码语法 CSS注释代码 CSS样式 内联式css样式 嵌入式css样式 外部式css样式 权值 CSS3选择器 标签选择器 类选择器 ID选择器 类与ID ...

最新文章

  1. SharePoint基础之六- SharePoint基础架构中涉及的ASP.NET架构
  2. Python基础教程(十一):多线程、XML解析
  3. django存入mysql数据库_django如何存数据到一个mysql数据表里面
  4. centos普通用户修改文件权限_Linux实战014:Centos创建用户并添加root授权
  5. 获取activemq 队列所有数据_ActiveMQ的应用
  6. pandas 读取某一单元格的值_一个参数一个Excel表,让你玩转Pandas中read_excel()表格读取!...
  7. 在rhel6 64位环境下部署LNMP环境
  8. 2021线报天下 原创工具 (免费版本,无版权问题)
  9. 乱下东西导致挖矿病毒Trojan,CoinMiner的解决记录
  10. 2021-3-4大学化学无机化学原理(1)理想气体的状态方程和分压定律
  11. 前端,网页设计常用色彩搭配表
  12. sdnu oj 1357.Text Reverse 字符串
  13. poi导出Excel合并单元格、设置打印参数页眉页脚等
  14. LTD营销SaaS-官微云代理商加盟服务
  15. mapping文件的编写
  16. 圣迭戈与哥大电子计算机,加州大学圣迭戈分校
  17. tomcat端口占用极其简单解决办法
  18. 时间复杂度和空间复杂度及多道例题讲解
  19. Java 2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示输入用户磅数,然后转换为千克并显示结果。一磅等于0.454千克。下面是一个运行示例:
  20. 计算机3d影视的应用程序,计算机3D技术在电影中的应用

热门文章

  1. MVC与MVP简单对比
  2. 超越百度的口罩检测算法
  3. nvidia 程序安装失败
  4. Python 计算各类距离
  5. QString与std::string的相互转换
  6. tf.train.Saver函数的用法之保存全部变量和模型
  7. missing template arguments before异常解决
  8. 华为和思科设备路由协议默认优先级总结
  9. c语言u64数据类型打印,小谈C语言中常见数据类型在32及64位机上的使用
  10. linux perl telnet安装,Perl--Net::Telnet模块