`

axis1.4与应用集成(续),解决Arraylist<...>的问题

    博客分类:
  • JAVA
阅读更多

前言:上一篇介绍了手动写客户端的axis1.4的应用实例,那个例子是没有问题的,但细心的同志们会发现,生成的wsdl文件是有问题的,比较刺眼的关键字是 ArrayOf_xsd_anyType 这个表明根本不认识list,而且list里放入的对象也没有在该WSDL文件里描述,这样带来的问题就是如果只根据WSDL文件来生成客户端,比如用axis1.4的wsdl2java命令

D:\develop_tools\axis-1_4\lib>java -cp .;axis.jar;jaxrpc.jar;saaj.jar;wsdl4j-1.5.1.jar;commons-discovery-0.2.jar;commons-logging-1.0.4.jar;log4j-1.2.8
.jar org.apache.axis.wsdl.WSDL2Java http://localhost:8091/bjchannel/services/EsopWBService1?wsdl

示例如上,的话,生成的类明显少了一个,就是list里放入的MenuNodeInterface类,这个在WSDL里根本没有体现

而且奇怪的是假如用list的话,如果添加了list的add方法,比如public void addMenuNodeInterface(MenuNodeInterface obj){list.add(obj);}(伪代码)的话,在生成的WSDL里就会有MenuNodeInterface的体现,但集合还是没有。这个看看AXIS的源码就明白了.

 

关于这个问题,首先参看axis1.4的官方文档user-guide.pdf,这个我在附件里上传上来,查看里面的

1.6.3里的1.6.3.1项,说的很清楚,由于LIST这些集合类和其他语言不通用,所以需要当作CUSTOM类自己做映射在service-config.xml里,那就麻烦了,加入实现类是ArrayList的话,还需要把相应的jar包加进来做映射;

所以后面有一句关键的:The most reliable way to send aggregate objects is to use arrays

有感觉没,对了,就是用[]数组来代替接口里需要的属性和返回值。

废话不说了,上代码

1:返回结果类

package com.asiainfo.boss.channel.channelservices;

import java.io.Serializable;


public class EsopResult1 implements Serializable{

	/**
	 * seriaId
	 */
	private static final long serialVersionUID = -1922115715606536898L;
	
	/**
	 * 0:成功
	   1:失败
	 */
	private Short returnCode=1;
	
	//一般不用语言特定的集合类,统一用数组代替
	//private List<MenuNodeInterface> sysMenuNodeList;
	
	private MenuNodeInterface[] sysMenuNodeList;
	
	private String errorMsg;
	
//	public EsopResult1(){
//		sysMenuNodeList=new ArrayList<MenuNodeInterface>();
//		sysMenuNodeList.add(new MenuNodeInterface());
//		
//	}
//	
	public EsopResult1(){
		sysMenuNodeList=new MenuNodeInterface[]{new MenuNodeInterface()};
		
		
	}

	public Short getReturnCode() {
		return returnCode;
	}

	public void setReturnCode(Short returnCode) {
		this.returnCode = returnCode;
	}

//	public List<MenuNodeInterface> getSysMenuNodeList() {
//		return sysMenuNodeList;
//	}
//
//	public void setSysMenuNodeList(List<MenuNodeInterface> sysMenuNodeList) {
//		this.sysMenuNodeList = sysMenuNodeList;
//	}
	//如果用list的话,还不光需要有list的set和get方法,还必须有addlist的方法,这样生成的wsdl才能包含list里的内容对象
	//不过即使这样,还是会有问题,总之用数组代替就对了
	public MenuNodeInterface[] getSysMenuNodeList() {
		return sysMenuNodeList;
	}

	public void setSysMenuNodeList(MenuNodeInterface[] sysMenuNodeList) {
		this.sysMenuNodeList = sysMenuNodeList;
	}
	

	public String getErrorMsg() {
		return errorMsg;
	}

	public void setErrorMsg(String errorMsg) {
		this.errorMsg = errorMsg;
	}


	
	
	
	
}

 

 

2:手动客户端调用测试类

package com.asiainfo.boss.channel.channelservices;


import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;

public class EsopWBClient1 {
	
	public static void main(String...args){
		getResult();
	}
	public static void getResult(){
		try {   
            String endpoint = "http://localhost:8091/bjchannel/services/EsopWBService1";   
            Long opId = new Long(1009);   
            Long orgId = new Long(1000);   
               
            Service service = new Service();   
            Call call = (Call) service.createCall();   
            QName qn = new QName("urn:EsopWBService1","EsopResult1"); 
            QName qn1 = new QName("urn:EsopWBService1","MenuNodeInterface"); 
            //注册 bean   
            call.registerTypeMapping(EsopResult1.class, qn,    
                    new BeanSerializerFactory(EsopResult1.class, qn),    
                    new BeanDeserializerFactory(EsopResult1.class, qn));  
            call.registerTypeMapping(MenuNodeInterface.class, qn1,    
                    new BeanSerializerFactory(MenuNodeInterface.class, qn1),    
                    new BeanDeserializerFactory(MenuNodeInterface.class, qn1));  
  
            call.setTargetEndpointAddress(new java.net.URL(endpoint));   
            call.setOperationName(new QName("EsopWBService1","qryMenuNodeInfoList"));
//            Object[] sss=new Object[2];
//            sss[0]=i1;
//            sss[1]=i2;
            //EsopResult1 ret = (EsopResult1) call.invoke("qryMenuNodeInfoList",new Object[]{i1,i2});
            //以下两个参数必须加,不然后报数组越界异常,因为源码里的operation为的params需要手动设置
            //invoke只负责往里传递数,不管原来方法参数的初始化,以下两句表明调用的方法需要初始化两个参数
            call.addParameter("opId", XMLType.XSD_LONG, ParameterMode.IN);
            call.addParameter("orgId", XMLType.XSD_LONG, ParameterMode.IN);
            EsopResult1 ret = (EsopResult1) call.invoke(new Object[]{opId,orgId});
            
  
            System.out.println("the operation result following:");   
            System.out.println("ErrorMsg = " + ret.getErrorMsg());   
            System.out.println("ReturnCode = " + ret.getReturnCode());   
//            这是用list做属性的客户端写法,没有问题,问题只会出现在wsdl的生成上,因为手写客户端在前面手动
//            注册了list里的内容对象,所以会取到,但是生成的wsdl里是没有的,所以依赖wsdl的wsdl2java生成的
//            客户端程序就有问题了。
//            System.out.println("MenuNodeList().size() = " + ret.getSysMenuNodeList().size());
//            List<MenuNodeInterface> reList=ret.getSysMenuNodeList();
            
            //以下是数组形式的调用
            System.out.println("MenuNodeList().length = " + ret.getSysMenuNodeList().length);
            MenuNodeInterface[] reList=ret.getSysMenuNodeList();
            
            for(MenuNodeInterface mni : reList){
            	System.out.println("菜单名称:"+mni.getS_Caption());
            }
             
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
	
}

 

 

 

其他的类参照上一篇文章,没有修改

配置文件也没有任何变化

 

OK,附件是我用wsdl2java生成的客户端类,和自己写的测试调用类,打包上传了,老规矩,代码里的报名和有些配置名字自己修改,我就不去除了

 

参考文章

http://forums.sun.com/thread.jspa?threadID=5405862

http://www.javalobby.org/java/forums/t84343.html

 

分享到:
评论
1 楼 KimShen 2010-10-20  
WebService使用经验告诉我们,你定义的对象越复杂你维护的成本也巨大.尤其是List,Map,Set这种特殊的数据结构.你会死的很难看

相关推荐

    Springboot集成axis1.4的demo

    &lt;version&gt;1.4&lt;/version&gt; &lt;/dependency&gt; &lt;!-- 添加Spring Web Services依赖 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web-services&lt;/artifactId&gt; &lt;/...

    axis1.4+activation.jar+mail.jar

    而单独的"mail.jar"和"activation.jar"文件,通常需要与Axis1.4一起部署,以提供完整的邮件处理和数据激活功能。 在实际应用中,开发者会解压axis-bin-1_4.tar.gz,配置相关设置,然后利用包含的工具生成Web服务...

    springboot+axis1.4

    通过以上步骤,你可以在Spring Boot应用中成功集成Axis1.4并创建和部署SOAP Web服务。这个过程中涉及的知识点涵盖了Spring Boot的启动配置、依赖管理、Web服务的创建与暴露、以及应用的测试与部署等多个方面。

    axis1.4完整包下载

    5. **配置文件**:如server.xml和axis.properties,这些文件控制Axis的行为和配置。 在标签“axis1.4”中,我们可以推测这个压缩包专门针对Axis的1.4版本,该版本可能修复了之前版本的一些已知问题,同时保持向后...

    axis2 调用webservice 例子

    &lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; &lt;artifactId&gt;axis2&lt;/artifactId&gt; &lt;version&gt;1.6.2&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.axis2&lt;/groupId&gt; &lt;artifactId&gt;axis2-...

    axis1.4生成客户端

    本文将深入探讨如何使用Axis1.4生成客户端,以及与之相关的知识点。 1. **Web服务基础**: Web服务是通过HTTP协议传输数据的一种方式,它允许不同的系统间进行互操作。WSDL(Web Services Description Language)...

    axis1.4和axis2相关jar文件

    4. **JAX-RPC兼容性**:Axis1遵循Java API for XML Processing (JAX-RPC) 规范,使得与J2EE应用服务器集成更加容易。 然而,随着Web服务技术的发展,Axis1的一些局限性逐渐显现,如性能较低、代码生成复杂等,因此...

    axis1.4帮助文档

    5. **客户端生成**:同样,Axis1.4可以从WSDL文件自动生成Java客户端代码,这使得开发者可以快速创建与Web服务交互的客户端应用程序。 6. **模块和Policy**:Axis1.4支持模块化架构,允许添加额外的功能或扩展。...

    axis1.4依赖包

    4. **集成Web服务**: 在集成Web服务时,Axis1.4可以作为一个客户端或者服务器端的栈。作为客户端,它可以自动生成Java stubs,使开发者能够像调用本地方法一样调用远程Web服务。作为服务器端,它可以将Java类自动...

    axis1.4开发需要用到的jar包

    1. **axis.jar**:这是 Axis1.4 的核心库,包含了处理 SOAP 消息、生成 WSDL(Web Services Description Language)文件、执行服务调用等功能。它提供了基于 Java 的 Web 服务实现,让开发者可以轻松创建和调用 Web ...

    axis1.4jar包以及WSDL和服务端代码互转方法

    使用-axis.wsdl选项运行wsdl2java工具,指定你的服务类,它将自动生成对应的WSDL文件。 2. **从WSDL生成服务端代码**: 反之,如果你有一个WSDL文件,可以使用Axis1.4将其转换为Java服务端代码。同样,确保Eclipse...

    springboot使用axis1.4的demo

    当我们需要在Spring Boot应用程序中集成Web服务时,Axis1.4提供了一个强大的工具。 首先,我们需要了解**Spring Boot**。它是一个基于Spring框架的脚手架,旨在简化创建独立的、生产级别的基于Spring的应用程序。...

    apache axis1.4实例

    在实际开发中,Apache Axis1.4常用于企业级应用集成,例如B2B系统之间的数据交换,或者为现有Java应用程序提供Web服务接口。它也可以与EJB、Spring等框架集成,构建复杂的分布式系统。 总结,Apache Axis1.4虽已...

    axis-bin-1_4.zip_Axis1.4-bin_axis 1.4_axis-1_4.rar_axis-bin-_axi

    在标题和描述中提到的"axis-bin-1_4.zip"和"Axis1.4-bin"是指 Axis 1.4 的二进制发行版,这个版本的AXIS包含了运行和开发Web服务所需的所有必要组件。"axis-1_4.rar"可能是同一版本的另一种压缩格式,而"axis-bin-_...

    axis-1.4.jar

    7. **错误处理和调试**:Axis提供了一套完整的错误处理机制,可以帮助开发者在开发过程中定位和解决问题。它还支持详细的日志记录,便于调试。 8. **国际化支持**:Axis支持多语言环境,可以处理不同地区的字符集和...

    apache axis1.4 官网备份

    Apache Axis1.4是历史悠久的一款开源SOAP(Simple Object Access Protocol)服务器和客户端库,它主要用于构建Web服务。这款工具在2003年发布,是Apache软件基金会的一部分,旨在简化XML-RPC和SOAP的实现。由于其...

    webservice axis1.4服务实例

    Web服务(Web Service)是一种基于网络的、分布式的模块化组件,它提供了标准的方法来让不同的应用程序在Internet上相互通信。Axis1.4是Apache Axis的一个版本,它是一个流行的开源工具,用于实现和部署Java Web服务...

    web service axis1.4 jar

    Axis1.4可以与EJB(Enterprise JavaBeans)、Spring框架、JMS(Java Message Service)等其他Java技术无缝集成,扩大了Web服务的使用范围。 10. **性能优化**: 虽然Axis1.4相较于现代的Web服务框架(如Apache ...

    Axis1.4相关jar包及配置

    标题中的"Axis1.4相关jar包及配置"指出,这个压缩包包含了Axis1.4框架所需的库文件和关于如何配置与使用的详细说明。Axis是一个开源的Web服务工具包,主要用于创建和部署SOAP(简单对象访问协议)服务,它是Apache ...

Global site tag (gtag.js) - Google Analytics