采用MyEclipse开发平台,采用xFire开发框架,开发webservice。如果说,webservice中方法的输入输出参数均为基本类型,比如int,string等,通过下面的方法可以调用:Client client = new Client(new URL("http://../webservice/services/servicename?wsdl"));
Object[] results = client.invoke("methodName",new Object[]{输入参数1,输入参数2,输入参数3,......});
boolean bool = (Boolean)results[0];//这里假设 输出结果 为boolean型
但是,如果输入参数,输出结果不是基本类型,比如说数组、自定义类,那么该如何传递这些数据,怎么调用webservice?

解决方案 »

  1.   

    关于xfire只用过一次,不是很懂!顶。。
      

  2.   

    你可以将对象转化为字符串,然后传递,另外一端,先解析字符串,然后在处理,不就OK了。
    例如
    有个用户对象user,包含有userName和pwd两个字段,你可以将它封装为
    String param = "userName=admin###pwd=123";然后另外一端用String.split("###")将这个拆开,然后封装为对象,进行处理。
    数组更好办,直接封装为"array1###array2###array3",这样,那边直接通过split("###")就可以得到这个数组的字符串了,然后在用上面说的对象字符串转换方法转换为对应的对象。具体转化为字符串的方式,可以参考Java的反射机制
      

  3.   

    帮lz顶上去~~希望lz能快点解决这个问题
      

  4.   

    楼主确实问了一个比较难的问题。没做过webservice所以不是很了解,但我做过一个.net的项目用过java提供的服务。但有些问题我不太明白,为什么webservice为什么要接受自定义类的对象呢?webservice是为其他web应用提供服务的吧,接受服务方与提供服务方很有可能并不是用同一个包开发程序,也有可能并不是由同种语言开发的程序。如果传自定义类的话,会造成接受服务方和提供服务方的高耦合吧。基本型可以比较方便的传递,如果需要传复杂的值的话是否可以考虑传递xml文件呢?
      

  5.   

    webServer 我写过一个 就在CSDN可以下载到
      

  6.   

    一样没有问题了,特别是JAVA发布 JAVA调用的话.楼主可以使用MYECLIPSE 的 XFIRE组件  根据WSDL生成客户端类 . 再进行调用 . 别用这种调用方式我尝试过传输集合,是没有问题的.鼠标对着工程右键,new-->>other-->>myeclipse-->>web services clinet
      

  7.   

    xml定义一个可以放这些数据的节点,我们公司自己是这样的:
           <param typ="string">param1</param>
           <!--.....-->
           <param typ="string">paramn</param>
           <param typ="recordset">//这个用来存放这些复杂的信息
      

  8.   

    将非基本类型打包成xml格式的字符串过去 ,再将xml串解析成你需要的类型  。楼主可以试试soap=http+xml 
      

  9.   

    38楼,可以说的具体 点吗?我用过这个方法,采用web service client,在转换代码时会报错。
      

  10.   

    我们是定义一个XML,拼SOAP 然后读取的
      

  11.   

    这种方法值得参考,话说我们公司全是用String类型进行操作......
      

  12.   

    利用多态的法方传值,
    大致思路:
    首先,建立一公共接口;
    public void checkValue(String 类型名称,Object 传入的对象,String 执行哪个法方);
    然后,建立相应的法方;
    也可以对某一通用法方进行多态。
    最后,执行你所需要的判断法方。
      

  13.   

    如果你客户端采用的axis的话,默认只能返回常用的几种数据类型,如果返回自定义的类型或者集合类型的话是需要注册返回类型的映射关系的。
    给一段代码你,希望对你有用
    Service service = new Service();
    Call call = (Call)service.createCall();
    call.setTargetEndpointAddress(new URL(url));//网络地址
    call.addParameter(new QName(url,"p1"), javax.xml.rpc.encoding.XMLType.SOAP_STRING, javax.xml.rpc.ParameterMode.IN);
    call.setOperationName(new QName(url,"getUserBySystemCode"));//调用的方法名
    //System.out.print("第二步成功了");
    call.setReturnType(new QName("entity.webservices.tjsoft.com", "User"), User.class);//
     // 注册映射关系 
    QName Userinfo = new QName("entity.webservices.tjsoft.com", "User");//此处的 User为WSDL文件中complexType name的属性值  //这里注册映射关系,对自定义的类进行序列化与反序列化。
    call.registerTypeMapping(User.class, Userinfo, new BeanSerializerFactory(User.class, Userinfo), 
    new BeanDeserializerFactory(User.class, Userinfo));//ITVAccount.class同上,
    //给方法传递参数,并且调用方法           
    Object[] obj = new Object[]{userCode};            

    User wuser = (User)call.invoke(obj);
    System.out.print("打印当前用户的Code  "+wuser.getPersonCode());
      

  14.   

    如果是用xfire 作为客户端的话,更方便
    // String url="http://localhost:8088/ServiceObject/services/ServiceObject";// //2.创建服务
    //
    // Service service=new ObjectServiceFactory().create(Sayhand.class);
    //
    // //3.创建服务代理
    //
    // XFireProxyFactory factory=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
    //
    // //4.调用外部的WebService, 建立对象. 再测试其方法
    //
    // try {
    //
    // Sayhand obj=(Sayhand)factory.create(service,url);
    //
    // System.out.println(obj.hellow("wanglu"));
    //
    // } catch (MalformedURLException e) {
    //
    // e.printStackTrace();
    //
    // }
      

  15.   

    最好的返回结果是xml类的字符串,然后让客户端解析,就不会有什么兼容性的问题了,一劳永逸