`
chenxilzx
  • 浏览: 22696 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java/WebService 对象传输

阅读更多

使用WebService来传输简单类型,不需要太复杂的操作,很简单的就可以实现,但是

如果你想传输一些大对象或者是自定义的类对象,则需要定义好相应的serializer和
deserializer,如果还是使用简单的SimpleDeserializer,那么很可能不会成功。

一、开发服务端
使用Eclipse开发一个服务类,他提供服务允许客户端访问本地的一个对象。
/////////////////////////////////////////////////////////////////
package samland.webservice.demo.mytestprj;

public class UserInfo implements java.io.Serializable {
 private static final long serialVersionUID = 2766274206307532403L;
 private String address;
 private int appid;
 private java.util.Date birthday;
 private String city;
 private String country;
 private String duty;
 private String email;
 private String faxno;
 private int gender;
 private String loginname;
 private String nickname;
 private String phoneno;
 private String province;
 private String sbirthday;
 private String url;
 private String userdesc;
 private int user2Orgid;
 private String username;
 private String zip;
 
 //setters and getters
 ...
}
/////////////////////////////////////////////////////////////////
package samland.webservice.demo.mytestprj;

import javax.xml.rpc.soap.SOAPFaultException;

public class UserManager {
 /**
  * 应用系统验证
  * @param token 应用系统管理员令牌字符串
  * @return true - 有对应服务的访问权限 <br> false - 无
  */
 public boolean authenticate(String token) {
  return true;
 }

 /**
  * 获取用户的详细资料
  * @param user2orgid 与组织关联的用户ID
  * @return 用户数据类对象
  */
 public UserInfo getUserInfo(int user2orgid) {
  UserInfo ui = new UserInfo();
  ui.setAddress("address");
  ui.setAppid(128);
  ui.setBirthday(new java.util.Date());
  ui.setGender(1);
  ui.setLoginname("loginname");
  ui.setNickname("nickname");
  ui.setUser2Orgid(user2orgid);
  ui.setUsername("username");
  ui.setZip("232323");
  return ui;
 }

}
/////////////////////////////////////////////////////////////////

二、发布
新建一个WebService,您可以使用Eclipse的向导:
New->Other...->Web Services->Web Service

Next:
选择一个WebService服务类,即UserManager。
Service implementation: samland.webservice.demo.mytestprj.UserManager
Configuration:
 Server: Tomcat v5.5
 Web service runtime: Apache Axis
 Service project:wsexample
 
下一步直至启动Tomcat v5.5服务器即可

三、开发客户端
在另外一个项目mytestprj中,新建一个WebService Client,你也可以使用Eclipse的向导:
New->Other...->Web Services->Web Service Client
选择一个wsdl文件,如:
Service definition: file:/X:/workspace/wsexample/WebContent/wsdl/UserManager.wsdl
Configuration:
 Server: Tomcat v5.5
 Web service runtime: Apache Axis
 Service project: mytestprj

Client Type: Java Proxy

下一步,选择输出文件夹,如
mytestprj/src/service

向导会在分析wsdl之后,在mytestprj/src/service下面生成这样一些文件:
samland/webservice/demo/mytestprj/UserInfo.java
samland/webservice/demo/mytestprj/UserManager.java
samland/webservice/demo/mytestprj/UserManagerProxy.java
samland/webservice/demo/mytestprj/UserManagerService.java
samland/webservice/demo/mytestprj/UserManagerServiceLocator.java
samland/webservice/demo/mytestprj/UserManagerSoapBindingStub.java

由于这些包路径与本项目不对应,我把他们都移动到这个目录下面
samland.mytestprj.webservices.impl,修改了文件中类的路径即可消除错误提示。

打开UserInfo.java仔细看看,他把自身的类型描述和serializer、deserializer等等
都定义好了,就不会担心SimpleDeserializer抛出错误了。摘要如下:
///////////////////////////////////////////////////////////////////////
// Type metadata
    private static org.apache.axis.description.TypeDesc typeDesc =
        new org.apache.axis.description.TypeDesc(UserInfo.class, true);

    static {
        typeDesc.setXmlType(new javax.xml.namespace.QName("http://gzgtj.demo.webservice.samland", "UserInfo"));
        org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("address");
        elemField.setXmlName(new javax.xml.namespace.QName("http://gzgtj.demo.webservice.samland", "address"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("appid");
        elemField.setXmlName(new javax.xml.namespace.QName("http://gzgtj.demo.webservice.samland", "appid"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"));
        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);
    }
///////////////////////////////////////////////////////////////////////

四、测试
保持第二步的服务是启动的,编写下面的类代码并Run As Java Application测试:
package samland.mytestprj.webservices;

import java.rmi.RemoteException;

import samland.mytestprj.webservices.impl.UserInfo;
import samland.mytestprj.webservices.impl.UserManagerProxy;

public class UserTest {
 public static void main(String[] asss){
  samland.mytestprj.webservices.impl.UserManager a = new UserManagerProxy();
  try {
   UserInfo ti = (UserInfo)a.getUserInfo(256);
   System.out.println(ti.getUsername());
   
   boolean b = a.authenticate("te");
   System.out.println(b);
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
}
Console将会输出下面的结果:
username
true

分享到:
评论
2 楼 kvpp0306 2013-01-10  
报错了:IWAB0398E Error in generating WSDL from Java:  java.lang.ClassCastException: org.apache.axis.encoding.ser.BeanSerializer cannot be cast to org.apache.axis.encoding.Serializer
1 楼 wenjundiandian 2012-09-17  
我的webservice在这个地方报错了.

private static org.apache.axis.description.TypeDesc typeDesc =
        new org.apache.axis.description.TypeDesc(UserInfo.class, true);

    elemField.setNillable(true);这个地方也报错 ....

底层源码是 public TypeDesc(java.lang.Class aClass) { /* compiled code */ }

    是不是版本问题.?

相关推荐

    java 利用webservice传输文件

    在“java 利用webservice传输文件”的场景中,JACOB可能被用来执行以下任务: 1. **文件操作**:Windows系统有许多内置的COM组件,如Scripting.FileSystemObject,可用于读写文件、创建目录等。通过JACOB,Java程序...

    java调用json参数的webservice

    在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...

    Java开发WebService实例

    ### Java开发WebService实例详解 在IT领域,尤其是企业级应用开发中,WebService作为一种标准化的、跨平台的服务交互方式,被广泛应用于系统间的数据交换与服务调用。本文将基于给定的“Java开发WebService实例”...

    JAVA调用webservice并解析xml

    2. **创建WebService客户端**:使用WSDL(Web Service Description Language)文件,你可以自动生成Java客户端代码。Eclipse和MyEclipse都有工具可以做到这一点。WSDL文件描述了Web服务的接口、操作、消息格式等。 ...

    UDT培训资料(AtomService/WebService)

    开发者需要了解如何将UDT对象转换为这些格式,并在接收端进行解析。 3. **集成与互操作性**: UDT需要与其他系统或服务无缝对接,因此理解如何在不同环境(如.NET与Java之间)中使用和理解UDT至关重要。 4. **错误...

    java调用webservice接口方法

    Java调用WebService接口方法是Java开发中常见的任务,尤其在分布式系统和跨平台通信中扮演着重要角色。这里我们主要探讨使用Apache Axis库来实现这一功能。Apache Axis是一款开源工具,它提供了Java到SOAP(简单对象...

    java开发webservice的简单例子

    Web服务基于开放标准,如XML(可扩展标记语言)、WSDL(Web服务描述语言)和SOAP(简单对象访问协议),使得服务提供者可以发布功能,而服务消费者可以跨平台调用这些功能。本示例将简要介绍如何使用Java来开发一个...

    JAVA用WebService实现调用天气预报功能

    WebService基于开放标准,如XML(可扩展标记语言)、WSDL(Web服务描述语言)和SOAP(简单对象访问协议),使得不同系统间的数据共享变得可能。Java作为跨平台的编程语言,提供了强大的工具来创建和消费Web服务。本...

    java调用webservice接口.zip

    本教程将深入探讨如何使用Axis库来实现在Java中调用WebService接口。Axis是一个开源的Java SOAP栈,它提供了从Java代码中创建和消费Web服务的能力。 **一、什么是WebService?** WebService是一种基于XML的协议,它...

    webservice 传输文件

    在“webservice传输文件”的场景中,我们主要探讨的是如何利用WebService技术来实现在网络环境中发送和接收文件。这个过程通常涉及XML(可扩展标记语言)、SOAP(简单对象访问协议)以及WSDL(Web服务描述语言)等...

    java+soap+webservice 调用模拟

    通过阅读提供的"java-soap-webservice"文档,你可以进一步了解具体的实现步骤,包括如何设置项目、配置JAX-WS、生成客户端代码、编写调用服务的代码,以及如何解析响应。实践中,不断动手操作和调试是掌握这一技术的...

    JAVA 的WebService 支持

    ### JAVA的WebService支持 #### SOA(Service-Oriented Architecture)概览 面向服务架构(SOA)是一种设计理念,它强调通过标准化的服务接口将不同功能模块连接起来,这些接口独立于具体的硬件平台、操作系统以及编程...

    Java-WebService应用实例

    4. **Spring框架**: Spring是一个全面的Java企业级应用开发框架,它提供了一个容器来管理对象的生命周期和依赖关系。Spring与XFire的集成允许开发者在Spring应用上下文中声明和配置WebService,通过AOP(面向切面...

    Java写WebService客户端

    ### Java编写WebService客户端详解 #### 一、概述 在现代软件开发中,Web服务作为一种重要的技术手段被广泛应用于系统间的数据交互与通信。其中,基于Java的WebService客户端开发更是占据了重要地位。本文将通过...

    JAVA的WebService支持

    5. JAXB:Java Architecture for XML Binding (JAXB) 是Java中的一个标准,用于XML与Java对象之间的自动转换。在Web服务中,JAXB用于在XML和Java数据类型之间进行序列化和反序列化,使得数据传输更加便捷。 6. ...

    java调用webservice的axis2.jar包

    Java调用WebService是Web服务交互的一种常见方式,而Axis2是一个高效的、可扩展的Web服务框架,它在Java世界中广泛用于创建和消费Web服务。本文将深入探讨使用Axis2.jar包来调用WebService的相关知识点。 一、Axis2...

    JAVA调用Webservice接口Demo

    本示例,"JAVA调用Webservice接口Demo",将向我们展示如何利用Java来与Webservice进行交互,主要包含两个功能:IP查询和根据省份查找城市。这个项目可以直接运行,方便开发者快速理解并应用到实际项目中。 首先,...

    Java WebService入门实例

    SOAP(Simple Object Access Protocol)是WebService通信的基础,它是一种轻量级的、基于XML的协议,用于在Web上传输数据。当客户端需要调用一个WebService的方法时,会按照以下步骤进行: - 客户端将方法名和...

Global site tag (gtag.js) - Google Analytics