`
youanyyou
  • 浏览: 196444 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

axis客户端接收不同参数类型

阅读更多

axis只支持简单类型的返回值。在这里逐一介绍axis的各种返回值接受。

1:axis接受基本类型,如int ,string等

引入的系统文件:

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

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;

Service service = new Service();//创建service对象
  Call call;
  try {

   call = (Call) service.createCall();//得到Call对象
   try {
    call.setTargetEndpointAddress(new  java.net.URL(Constants.sns_sms_service));//将要访问的接口地址,将接口地址加上?wsdl在浏览器中访问就可以查看到wsdl文件的信息,以及你所需要的参数名称等。
   } catch (MalformedURLException e) {
    e.printStackTrace();
   }
   call.setOperationName("sendSms");//WSDL 里面描述的接口名称
   call.getMessageContext().setUsername(Constants.sns_httpbase_username);//http 认证用户名
   call.getMessageContext().setPassword(Constants.sns_httpbase_password);//http 认证密码
   call.addParameter("sendnum", org.apache.axis.encoding.XMLType.XSD_STRING,

     javax.xml.rpc.ParameterMode.IN);//接口的参数 sendnum 为String类型。addParameter()第一个参数是参数的名称与wsdl中相对应必须相同。第二个参数是参数的类型 。也必须与wsdl相同。
   call.addParameter("acceptnums", org.apache.axis.encoding.XMLType.XSD_STRING,

     javax.xml.rpc.ParameterMode.IN);//接口的参数
   call.addParameter("smscnt", org.apache.axis.encoding.XMLType.XSD_STRING,

     javax.xml.rpc.ParameterMode.IN);//接口的参数
   call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 设置返回类型  简单类型的返回就可以这样简单操作,只要设置返回类型即可。甚至可以不设置返回类型。不设置返回类型操作方法请看2
   Object xml;
   try {
    xml = (Object)call.invoke(new Object[]{send,reving,content});//参数的顺序与addParameter的顺序相同,且设置了 addParmaters就必须setRuturnType返回值
    //给方法传递参数,并且调用方法

    System.out.println("result is "+xml);
   } catch (RemoteException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

 
  } catch (ServiceException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

2.不设置返回类型的简单类型返回值。

Service和Call的创建都与1相同。

call = (Call) service.createCall();
  call.setOperationName(new QName(url, "getIByusername"));//getByusername是服务端接口的方法名称url是接口地址
  call.setTargetEndpointAddress(new java.net.URL(url));//接口地址
  Object o =  call.invoke(new Object[] { account ,IP, mcode });//这里直接传入参数,但是需要注意的是,传入的参数顺序必须与wsdl顺序相同,且类型相同。可以接收一个map的对象。

3.。返回值为自定义对象

try{
  String url = Constants.sns_login_service; 
     Service service = new Service(); 
        Call call = (Call) service.createCall(); 
        call.setTargetEndpointAddress(url); 
        call.setOperationName(new QName(url, "Login"));//Login为要调用的方法名 

    // hoope.views.api.login_service.LoginService为 wsdl中 targetNamespace 的值 以下相同
         call.addParameter(new QName("hoope.views.api.login_service.LoginService", 
         "username"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的username为传入参数的变量名字 
         call.addParameter(new QName("hoope.views.api.login_service.LoginService", 
         "pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的units为传入参数的变量名字 
         call.addParameter(new QName("hoope.views.api.login_service.LoginService", 
         "code"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的code为传入参数的变量名字 
        
         call.setReturnType(new QName("hoope.views.api.login_service.LoginService", 
        "response"), ITVAccount.class);//ITVAccount这里是重点,返回时主要在这配置,ITVAccount为返回的对象 

        // 注册映射关系 
        QName XljgInfo = new QName("hoope.views.api.login_service.LoginService", "LoginInfoDict");//此处的 LoginInfoDict为WSDL文件中complexType name的属性值 

//这里注册映射关系,对自定义的类进行序列化与反序列化。

        call.registerTypeMapping(ITVAccount.class, XljgInfo, 
                new BeanSerializerFactory(ITVAccount.class, XljgInfo), 
                new BeanDeserializerFactory(ITVAccount.class, XljgInfo));//ITVAccount.class同上,

        ITVAccount itv =(ITVAccount) call.invoke(new Object[] {account,pwd,code});//接口接收的参数
        if(itv!=null){
         itv.setNickName(itv.getNickname());
         itv.setUserName(itv.getUsername());
         itv.setMobilePhone(itv.getUserphone());
        }
        System.out.println("xljg="+itv);//打印输出对象
  } catch (ServiceException e) { 
        e.printStackTrace(); 
    } catch (RemoteException e) { 
        e.printStackTrace(); 
    }

4。返回自定义数组对象

返回数组对象与3相似,只要将注册返回类型为数组即可。

try{
  String url = Constants.sns_login_service; 
     Service service = new Service(); 
        Call call = (Call) service.createCall(); 
        call.setTargetEndpointAddress(url); 
        call.setOperationName(new QName(url, "Login"));//Login为要调用的方法名 

    // hoope.views.api.login_service.LoginService为 wsdl中 targetNamespace 的值 以下相同
         call.addParameter(new QName("hoope.views.api.login_service.LoginService", 
         "username"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的username为传入参数的变量名字 
         call.addParameter(new QName("hoope.views.api.login_service.LoginService", 
         "pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的units为传入参数的变量名字 
         call.addParameter(new QName("hoope.views.api.login_service.LoginService", 
         "code"),XMLType.SOAP_STRING,ParameterMode.IN);//这里的code为传入参数的变量名字 
        
         call.setReturnType(new QName("hoope.views.api.login_service.LoginService", 
        "response"), ITVAccount[].class );//ITVAccount 这里是重点,返回时主要在这配置,ITVAccount为返回数组对象 

        // 注册映射关系 
        QName XljgInfo = new QName("hoope.views.api.login_service.LoginService", "LoginInfoDict");//此处的 LoginInfoDict为WSDL文件中complexType name的属性值 

//这里注册映射关系,对自定义的类进行序列化与反序列化。

        call.registerTypeMapping(ITVAccount[].class , XljgInfo, 
                new BeanSerializerFactory(ITVAccount[]. class, XljgInfo), 
                new BeanDeserializerFactory(ITVAccount[]. class, XljgInfo));//ITVAccount.class同上,

        ITVAccount[] itv =(ITVAccount[]) call.invoke(new Object[] {account,pwd,code});//接口接收的参数
              System.out.println("xljg="+itv);//打印输出数组 
  } catch (ServiceException e) { 
        e.printStackTrace(); 
    } catch (RemoteException e) { 
        e.printStackTrace(); 
    } 
5。返回值为对象中包含对象及对象中包含数组

 try {  
             Service service = new Service(); 
             Call call = (Call) service.createCall(); 
             call.setTargetEndpointAddress(url); 
             call.setOperationName( new QName(url, " seachRelateUserInfo " )); // seachRelateUserInfo为要调用的方法名 
             call.getMessageContext().setUsername( " admin " ); // httpbase认证用户名
             call.getMessageContext().setPassword( " admin " ); // httpbase认证密码
             // hoope.views.api.userinfo_service.UserInfoWebService  为 wsdl中 targetNamespace 的值 以下相同
              call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 
              " condition " ),XMLType.SOAP_STRING,ParameterMode.IN); // 这里的condition为传入参数的变量名字 
             
              call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 
              " type " ),XMLType.SOAP_INT,ParameterMode.IN); // 这里的type为传入参数的变量名字 
             
              call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 
              " start " ),XMLType.SOAP_INT,ParameterMode.IN); // 这里的start为传入参数的变量名字 
             
              call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 
              " pagesize " ),XMLType.SOAP_INT,ParameterMode.IN); // 这里的pagesize为传入参数的变量名字 
             
              call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 
              " checkcode " ),XMLType.SOAP_STRING,ParameterMode.IN); // 这里的checkcode为传入参数的变量名字 
             
              call.setReturnType( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 
              " response " ), MapInfoDict. class ); // 这里设置返回值的类型

           // 注册映射关系   // 此处的MapInfoDict userInfoDictArray userInfoDict为WSDL文件中complexType name的属性值  首先找到返回对象的complexType再看它中是否有其他的对象类型自定义对象类型,然后依次映射。
              // 这里返回对象的complexType为MapInfoDict,MapInfoDict中有一个userInfoDictArray的对象,userInfoDictArray的对象中有一个List<UserInfoDict>的集合。
              // 问题就在这里,这个集合获取不到。
             QName XljgInfo = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " MapInfoDict " );
             QName XljgInfo2 = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " userInfoDictArray " );
             QName XljgInfo3 = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " userInfoDict " );
           
           // 为自定义类型进行序列化和反序列化。必须与上面定义的QName匹配。它与服务端返回的类型做映射匹配。
             call.registerTypeMapping(MapInfoDict. class , XljgInfo, 
                     new BeanSerializerFactory(MapInfoDict. class , XljgInfo), 
                     new BeanDeserializerFactory(MapInfoDict. class , XljgInfo));

             call.registerTypeMapping(UserInfoDictArray. class , XljgInfo2, 
                     new BeanSerializerFactory(UserInfoDictArray. class , XljgInfo2), 
                     new BeanDeserializerFactory(UserInfoDictArray. class , XljgInfo2));
            
     
//对 UserInfoDictArray中存在的是对象,则直接对对象进行序列化与反序列话即可。但如果UserInfoDictArray中的是List该如何去映射呢?该如何序列化呢?还没找到实现方法。待解决中。。。望高人指点。
call.registerTypeMapping(UserInfoDict. class , XljgInfo3, 
                     new BeanSerializerFactory(UserInfoDict. class , XljgInfo3), 
                     new BeanDeserializerFactory(UserInfoDict. class , XljgInfo3));[ / color]
             MapInfoDict xljg = (MapInfoDict) call.invoke( new Object[] {parm, " 1 " , " 1 " , " 20 " , " itv " }); // 执行调用服务接口

System.out.println( " xljg= " + xljg); // 打印输出
         } catch (ServiceException e) { 
             e.printStackTrace(); 
         } catch (RemoteException e) { 
             e.printStackTrace(); 
         } 

 

深圳人才网 深圳招聘网 深圳人才招聘网 深圳人才大市场 

企业、个人免费注册,获取想要的 深圳 软件工程师招聘信息 月薪最低3000-8000,更有高端猎头职位! 

www.szrcwz.com                                                                                                                                           

                  Google 提供的广告

0
0
分享到:
评论

相关推荐

    axis客户端

    使用Axis客户端,开发者可以轻松地集成远程服务到自己的应用程序中,使得不同系统之间的交互变得无缝。 1. **rt.jar**:这是一个运行时库,包含了Java标准版(JRE)的基础类库。在Java应用程序中,rt.jar是Java运行...

    在axis1.4中传递复杂类型数组参数(ArrayMapping)

    在 Axis1.4 中传递复杂类型数组参数,涉及到的是 Web 服务中的数据绑定和消息处理。Axis 是一个开源的 SOAP 库,它允许开发者创建、部署和使用 Web 服务。在处理复杂类型数组时,ArrayMapping 是 Axis 中的一个关键...

    axis2客户端调用webService接口,精简jar包

    4. **调用服务**: 使用Stub实例的方法调用远程服务,传递参数并接收返回值。 在实际应用中,为了调用Web服务,我们通常需要引用一系列的Axis2相关的jar包。然而,这些jar包往往数量众多,可能会增加项目的体积。...

    cxf客户端调用axis服务端流程

    现在你可以通过代理对象调用服务端的方法,传入必要的参数,并接收返回结果。 ```java Response response = port.myMethod(requestObject); ``` #### 7. 错误处理和资源释放 在调用完成后,别忘了清理和关闭资源...

    AXIS1.4客户端调用

    它定义了一种标准的封装、编码和寻址消息的方法,使得不同的系统可以交换结构化和类型化的信息。 2. **Apache Axis**:Apache Axis是Java平台上用于构建和使用Web服务的框架。它包含了一系列工具,如wsdl2java...

    axis2服务发布与客户端代码示例

    标题 "Axis2服务发布与客户端代码示例" 涉及到的是Apache Axis2框架下如何创建和调用Web服务的实践。Apache Axis2是一个强大的Web服务引擎,它基于SOAP协议,用于构建和部署Web服务。这篇博客文章可能提供了一个实际...

    AXIS2客户端调用实例

    4. **实例化并调用服务**:在客户端代码中,创建stub类的实例,然后通过实例调用服务的方法,传递参数并获取返回值。 5. **处理响应**:服务的响应通常以XML形式返回,客户端需要解析这个响应,并根据业务逻辑进行...

    axis2-1.6.2客户端最少jar包

    标题 "axis2-1.6.2客户端最少jar包" 指的是Apache Axis2的1.6.2版本中,用于构建客户端应用程序所需的最小Java Archive (JAR) 文件集合。Axis2是一个流行的Web服务框架,它允许开发人员创建、部署和管理Web服务。这...

    axis2 1.6.2 生产wsdl客户端代码

    在IT行业中,Web服务是一种广泛使用的接口技术,用于不同系统之间的数据交换和功能调用。Axis2是Apache软件基金会开发的一个高效、灵活的Web服务框架,它基于Java语言,为开发和部署Web服务提供了强大的支持。本文将...

    axis2客户端

    - 模块化:可以通过加载不同的模块来扩展Axis2的功能。 总结,Axis2客户端是开发Web服务应用程序的强大工具,它简化了与远程Web服务的交互过程。通过生成的Stub类,开发者可以方便地调用Web服务方法,同时还能利用...

    Web Service开发及axis 的客户端使用.rar

    4. 在客户端项目中引入生成的客户端代码库,编写调用服务的代码,传入参数并接收返回结果。 总结,Web服务开发是企业级应用集成的关键技术,而Apache Axis作为强大的工具,简化了这一过程。理解并熟练掌握Web服务...

    axis-1_4生成websevices客户端下载cmd输入就能生成

    4. **调用Web服务**:使用生成的Stub类,你可以设置请求参数,然后调用对应的方法来发送SOAP请求并接收响应。例如: ```java ServiceNamePortTypeStub stub = new ServiceNamePortTypeStub(); SomeResponseType ...

    axis复杂类型axis复杂类型

    这意味着当服务接收到`myNS:Student`类型的XML消息时,Axis会知道如何将其转换为JavaBean对象,反之亦然。 在实际调用Web服务时,客户端需要根据`StudentInfoService`这个服务名和提供的方法(例如`getAStudent`)...

    AXIS1.4webservice服务端和客户端例子

    WSDL文件描述了Web服务的接口,包括方法名、参数和返回类型。 3. **部署服务**: 将生成的Java源代码编译并部署到Web服务器,如Apache Tomcat。在这个例子中,提供了`apache-tomcat-6.0.18`版本,这将作为运行Web...

    Axis2_1.4.1客户端内存溢出

    这些方法的实现是服务端的核心逻辑,通过XML配置文件`services.xml`进行描述,该文件位于`TestService\META-INF\services.xml`下,定义了服务名、描述、服务类以及消息接收器,以支持不同类型的Web服务交互模式。...

    cxf_axis_xfire客户端调用的几种方法[收集].pdf

    在本文中,我们将重点关注CXF客户端调用Web服务的方法,特别是处理Map类型参数的问题。 首先,CXF客户端调用Web服务时,通常会通过服务接口类来实现。在给出的示例中,`TestService`接口定义了几个服务方法,如`...

    手写Axis1.4发布WebService以及客户端调用

    标题中的“手写Axis1.4发布WebService以及客户端调用”指的是使用Apache Axis1.4框架来创建和消费Web服务的过程。Apache Axis是用于构建Web服务的一个开源工具,它允许开发者将Java类转换为Web服务,并且提供客户端...

    SpringBoot开发WebService之Axis示例

    8. **测试Web服务**:使用SOAP客户端工具,如SoapUI,来测试我们的Web服务是否正常工作。 通过以上步骤,我们就成功地在SpringBoot中集成了Axis并创建了一个Web服务。这种组合的优势在于,SpringBoot的自动化配置和...

    axis 上传附件跟接收附件

    这些方法通常会接受 `java.io.InputStream` 或 `java.io.File` 对象作为参数,以便从客户端接收文件内容。 - **生成服务**:使用 Axis 的 wsdl2java 工具,根据服务接口生成相应的 Java 类和服务部署描述符(WSDL)...

    Axis2服务端wsimport客户端代码.zip

    3. WSDL文件:Web服务描述语言,定义了服务的接口、操作和数据类型,是wsimport生成客户端代码的输入。 4. README或指导文档:解释如何编译、运行服务端和客户端代码,以及可能遇到的问题和解决方案。 【知识点详细...

Global site tag (gtag.js) - Google Analytics