- 浏览: 344534 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zqb666kkk:
有示例代码吗
WebService CXF学习(高级篇3):WS-Security -
zhujiangtaobl0505:
楼主有源码没?发下,我邮箱465971531@qq.com,我 ...
WebService CXF学习(高级篇2):CXF+Spring+Hibernate -
ssy341:
http://localhost:8080/jforum/in ...
JForum安装详解 -
songzht:
看了上面的代码,这两个类型是怎么定义的?private Bas ...
JfreeChar结合struts2展示柱状图和饼状图(已解决乱码问题) -
Getwaysun:
持久化类中使用boolean定义某个字段后,报Null val ...
null不能赋值给int类型,Integer可以。
近期项目中需要用到webservice,接口提供方使用.net编写,返回的是自定义对象,对象中有图片。
接口描述文件如下
wsdl文件如下
调用过程
我在调用接口过程中碰到的难题是对返回对象的接受,返回对象是.net中定义的,在java中接受就需要进行序列化,序列化的问题搞了好几天没进展,最后实在没招了就还是使用啦
AXIS1.4的 wsdl2java 生成客户端,从生成的代码中找到了序列化返回对象的类,修改后直接引用。
返回对象在java中的定义(通过wsdl2java生成)
当时问什么不直接用wsdl2java生成客户端是因为生成的代码在当时还读不懂,没有可控性
所以选择了自己手写客户端,第一次学习使用webservice,有不足地方请大家指正,共同学习,共同前进。
接口描述文件如下
POST /FJJTMapService/Service.asmx HTTP/1.1 Host: 192.168.5.92 Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <ChartService xmlns="http://www.fzis.com.cn/"> <type>string</type> <width>int</width> <height>int</height> <imageType>string</imageType> <fieldnames>string</fieldnames> <fieldvalues>string</fieldvalues> <rgbcolors>string</rgbcolors> <chartType>string</chartType> <size>string</size> </ChartService> </soap12:Body> </soap12:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <ChartServiceResponse xmlns="http://www.fzis.com.cn/"> <ChartServiceResult> <Xmax>double</Xmax> <Xmin>double</Xmin> <Ymax>double</Ymax> <Ymin>double</Ymin> <MapByte>base64Binary</MapByte> <ErrorMessage>string</ErrorMessage> </ChartServiceResult> </ChartServiceResponse> </soap12:Body> </soap12:Envelope>
wsdl文件如下
//返回对象 <s:complexType name="Map"> - <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Xmax" type="s:double" /> <s:element minOccurs="1" maxOccurs="1" name="Xmin" type="s:double" /> <s:element minOccurs="1" maxOccurs="1" name="Ymax" type="s:double" /> <s:element minOccurs="1" maxOccurs="1" name="Ymin" type="s:double" /> <s:element minOccurs="0" maxOccurs="1" name="MapByte" type="s:base64Binary" /> <s:element minOccurs="0" maxOccurs="1" name="ErrorMessage" type="s:string" /> </s:sequence> </s:complexType> //调用方法 - <s:element name="ChartService"> - <s:complexType> - <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="type" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="width" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="height" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="imageType" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="fieldnames" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="fieldvalues" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="rgbcolors" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="chartType" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="size" type="s:string" /> </s:sequence> </s:complexType> </s:element> - <s:element name="ChartServiceResponse"> - <s:complexType> - <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="ChartServiceResult" type="tns:Map" /> </s:sequence> </s:complexType> </s:element>
调用过程
try { // WebService URL String url = "http://192.168.5.92/FJJTMapService/Service.asmx"; String namespace = "http://www.fzis.com.cn/"; String method = "ChartService"; //创建调用服务 Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(url)); call.setUseSOAPAction(true); call.setSOAPActionURI(namespace+method); //注册对象 QName qn=new QName(namespace, "Map"); call.registerTypeMapping(RouteThemeResult.class, qn, new org.apache.axis.encoding.ser. BeanSerializerFactory(RouteThemeResult.class, qn), new org.apache.axis.encoding.ser. BeanDeserializerFactory(RouteThemeResult.class, qn)); // 设置要调用的方法 call.setOperationName(new QName(namespace, method)); // 该方法需要的参数 call.addParameter(new QName(namespace,"type"),XMLType.XSD_STRING,ParameterMode.IN); call.addParameter(new QName(namespace,"width"),XMLType.XSD_INT,ParameterMode.IN); call.addParameter(new QName(namespace,"height"),XMLType.XSD_INT,ParameterMode.IN); call.addParameter(new QName(namespace,"imageType"),XMLType.XSD_STRING,ParameterMode.IN); call.addParameter(new QName(namespace,"fieldnames"),XMLType.XSD_STRING,ParameterMode.IN); call.addParameter(new QName(namespace,"fieldvalues"),XMLType.XSD_STRING,ParameterMode.IN); call.addParameter(new QName(namespace,"rgbcolors"),XMLType.XSD_STRING,ParameterMode.IN); call.addParameter(new QName(namespace,"chartType"),XMLType.XSD_STRING,ParameterMode.IN); call.addParameter(new QName(namespace,"size"),XMLType.XSD_STRING,ParameterMode.IN); // 方法的返回值类型 //call.setReturnType(XMLType.XSD_STRING); call.setReturnType(qn); //设置参数 String type = gisChartInfo.getLayername(); int width = gisChartInfo.getWidth(); int height = gisChartInfo.getHeight(); String imageType = gisChartInfo.getImageType(); String fieldnames = gisChartInfo.getFieldnames(); String fieldvalues = gisChartInfo.getFieldvalues(); String rgbcolors = gisChartInfo.getRgbcolors(); String chartType = gisChartInfo.getChartType(); String size = gisChartInfo.getSize(); Object[] parameters = null; parameters = new Object[]{type,width+"",height+"",imageType,fieldnames,fieldvalues,rgbcolors,chartType,size}; // 调用该方法 byte[] imageBytes ; RouteThemeResult result = new RouteThemeResult() ; Object obj = call.invoke(parameters); if(obj!=null){ System.out.println("ishere:"); if (obj instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)obj; } else { try { result = (RouteThemeResult) obj; } catch (java.lang.Exception _exception) { result = (RouteThemeResult) org.apache.axis.utils.JavaUtils.convert(obj, RouteThemeResult.class); } } }
我在调用接口过程中碰到的难题是对返回对象的接受,返回对象是.net中定义的,在java中接受就需要进行序列化,序列化的问题搞了好几天没进展,最后实在没招了就还是使用啦
AXIS1.4的 wsdl2java 生成客户端,从生成的代码中找到了序列化返回对象的类,修改后直接引用。
返回对象在java中的定义(通过wsdl2java生成)
public class RouteThemeResult implements java.io.Serializable { private double xmax; private double xmin; private double ymax; private double ymin; private byte[] mapByte; private java.lang.String errorMessage; public RouteThemeResult() { } public RouteThemeResult( double xmax, double xmin, double ymax, double ymin, byte[] mapByte, java.lang.String errorMessage) { this.xmax = xmax; this.xmin = xmin; this.ymax = ymax; this.ymin = ymin; this.mapByte = mapByte; this.errorMessage = errorMessage; } /** * Gets the xmax value for this Map. * * @return xmax */ public double getXmax() { return xmax; } /** * Sets the xmax value for this Map. * * @param xmax */ public void setXmax(double xmax) { this.xmax = xmax; } /** * Gets the xmin value for this Map. * * @return xmin */ public double getXmin() { return xmin; } /** * Sets the xmin value for this Map. * * @param xmin */ public void setXmin(double xmin) { this.xmin = xmin; } /** * Gets the ymax value for this Map. * * @return ymax */ public double getYmax() { return ymax; } /** * Sets the ymax value for this Map. * * @param ymax */ public void setYmax(double ymax) { this.ymax = ymax; } /** * Gets the ymin value for this Map. * * @return ymin */ public double getYmin() { return ymin; } /** * Sets the ymin value for this Map. * * @param ymin */ public void setYmin(double ymin) { this.ymin = ymin; } /** * Gets the mapByte value for this Map. * * @return mapByte */ public byte[] getMapByte() { return mapByte; } /** * Sets the mapByte value for this Map. * * @param mapByte */ public void setMapByte(byte[] mapByte) { this.mapByte = mapByte; } /** * Gets the errorMessage value for this Map. * * @return errorMessage */ public java.lang.String getErrorMessage() { return errorMessage; } /** * Sets the errorMessage value for this Map. * * @param errorMessage */ public void setErrorMessage(java.lang.String errorMessage) { this.errorMessage = errorMessage; } private java.lang.Object __equalsCalc = null; public synchronized boolean equals(java.lang.Object obj) { if (!(obj instanceof RouteThemeResult)) return false; RouteThemeResult other = (RouteThemeResult) obj; if (obj == null) return false; if (this == obj) return true; if (__equalsCalc != null) { return (__equalsCalc == obj); } __equalsCalc = obj; boolean _equals; _equals = true && this.xmax == other.getXmax() && this.xmin == other.getXmin() && this.ymax == other.getYmax() && this.ymin == other.getYmin() && ((this.mapByte==null && other.getMapByte()==null) || (this.mapByte!=null && java.util.Arrays.equals(this.mapByte, other.getMapByte()))) && ((this.errorMessage==null && other.getErrorMessage()==null) || (this.errorMessage!=null && this.errorMessage.equals(other.getErrorMessage()))); __equalsCalc = null; return _equals; } private boolean __hashCodeCalc = false; public synchronized int hashCode() { if (__hashCodeCalc) { return 0; } __hashCodeCalc = true; int _hashCode = 1; _hashCode += new Double(getXmax()).hashCode(); _hashCode += new Double(getXmin()).hashCode(); _hashCode += new Double(getYmax()).hashCode(); _hashCode += new Double(getYmin()).hashCode(); if (getMapByte() != null) { for (int i=0; i<java.lang.reflect.Array.getLength(getMapByte()); i++) { java.lang.Object obj = java.lang.reflect.Array.get(getMapByte(), i); if (obj != null && !obj.getClass().isArray()) { _hashCode += obj.hashCode(); } } } if (getErrorMessage() != null) { _hashCode += getErrorMessage().hashCode(); } __hashCodeCalc = false; return _hashCode; } // Type metadata private static org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(RouteThemeResult.class, true); static { typeDesc.setXmlType(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Map")); org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("xmax"); elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Xmax")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double")); elemField.setNillable(false); typeDesc.addFieldDesc(elemField); elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("xmin"); elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Xmin")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double")); elemField.setNillable(false); typeDesc.addFieldDesc(elemField); elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("ymax"); elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Ymax")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double")); elemField.setNillable(false); typeDesc.addFieldDesc(elemField); elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("ymin"); elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Ymin")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double")); elemField.setNillable(false); typeDesc.addFieldDesc(elemField); elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("mapByte"); elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "MapByte")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "base64Binary")); elemField.setMinOccurs(0); elemField.setNillable(false); typeDesc.addFieldDesc(elemField); elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("errorMessage"); elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "ErrorMessage")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); elemField.setMinOccurs(0); elemField.setNillable(false); typeDesc.addFieldDesc(elemField); } /** * Return type metadata object */ public static org.apache.axis.description.TypeDesc getTypeDesc() { return typeDesc; } /** * Get Custom Serializer */ public static org.apache.axis.encoding.Serializer getSerializer( java.lang.String mechType, java.lang.Class _javaType, javax.xml.namespace.QName _xmlType) { return new org.apache.axis.encoding.ser.BeanSerializer( _javaType, _xmlType, typeDesc); } /** * Get Custom Deserializer */ public static org.apache.axis.encoding.Deserializer getDeserializer( java.lang.String mechType, java.lang.Class _javaType, javax.xml.namespace.QName _xmlType) { return new org.apache.axis.encoding.ser.BeanDeserializer( _javaType, _xmlType, typeDesc); } }
当时问什么不直接用wsdl2java生成客户端是因为生成的代码在当时还读不懂,没有可控性
所以选择了自己手写客户端,第一次学习使用webservice,有不足地方请大家指正,共同学习,共同前进。
评论
2 楼
lianj_lee
2009-09-10
谢谢 在网上找了N久,没有看到一个像样的文章 都是抄过来抄过去的。
中国的程序员真是相当 “拉及”!
中国的程序员真是相当 “拉及”!
1 楼
lz726
2009-08-11
非常感谢。。。
发表评论
-
svnserver配置文件详解
2013-02-26 15:43 1408svnserve是SVN自带的一个轻型服务器,客户端通过使 ... -
启动tomcat报StandardServer.await: create[8005]
2013-02-19 11:15 1162启动tomcat报StandardServer. ... -
js读取excel
2012-09-26 17:26 2259项目需要用到将excel中的数据导入到页面的文本框中,但并不想 ... -
java里的split函数
2012-04-11 16:55 1042今天要用到split函数,对浮点数进行分割为子字符串,然后将结 ... -
sqlserver 2005 Network error IOException: Connection refused: connect
2010-07-12 11:29 1809打开程序 Microsoft SQL Server 服务器网络 ... -
Eclipse快捷键应用
2010-05-18 11:17 11721. 已知接口,查找实现类(已知实现类,查找接口) 光标 ... -
重置mysql5.1的root密码
2009-12-29 15:13 2163首先在 MySQL的安装目录下 新建一个pwdhf.txt, ... -
dom4j生成xml的编码问题
2008-11-11 15:55 1781文章引用:http://blog.csdn.net/redez ... -
null不能赋值给int类型,Integer可以。
2008-03-12 12:00 12641报错Null value was assigned to a ...
相关推荐
2025最新全国水利安全生产知识竞赛题库(含答案).docx
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
因为文件过大所以使用bz2进行了2次压缩,请解压成tar包后在上传到服务器
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
iostat打印解析画图工具
1、文件内容:fence-agents-compute-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-compute-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
PDF格式,229页,包括有环保,新能源,木工,包装等行业的应用。适用于电气自动化行业。
1、文件内容:dropwatch-1.4-9.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/dropwatch-1.4-9.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1、文件内容:fence-agents-emerson-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-emerson-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
航空发动机磨粒荷电特性研究.pdf
第十一届蓝桥杯大赛个人赛校内选拔(软件类)真题全面考察了参赛选手的编程与算法能力,涵盖多个热门编程语言,为选手提供了展现自身实力的舞台。 考察范围与方向 真题在编程语言上聚焦于 C/C++、Java、Python 等主流语言。考察内容广泛,既有基础的语法运用,也涉及复杂的数据结构和算法。数据结构方面,对数组、链表、栈、队列、哈希表等的使用有不同程度的考察;算法上,动态规划、贪心算法、搜索算法等经典算法是考察重点。 题型示例与特点 在具体题型上,有数值计算类题目,例如给定条件计算特定数值,要求选手有较强的逻辑思维和数学运算能力;字符串处理类题目,如字符串匹配、替换等,考验选手对字符串操作函数的熟悉程度;还有图论与搜索类题目,像最短路径问题,需要选手掌握相应的搜索算法。 考察目的与意义 这次校内选拔真题旨在筛选出编程能力强、算法思维敏捷的选手,为后续的正式比赛储备人才。通过解答这些真题,选手能发现自身知识短板,明确学习方向。对于学校而言,能了解学生的编程水平,为教学改进提供参考。同时,这也为学生提供了与同龄人交流切磋的机会,激发他们学习编程的热情,提升解决实际问题的能力。
一种采用耦合电感的开关电路分析.pdf
rancher-active-proxy
RSSIIndoorLocation-master
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1、文件内容:exchange-bmc-os-info-1.8.18-11.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/exchange-bmc-os-info-1.8.18-11.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
1、文件内容:docbook-style-xsl-1.78.1-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/docbook-style-xsl-1.78.1-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装