Java6 WebService 使用复杂对象

复杂对象可表示的语义比简单对象强大很多,这里看看在Java6的WebService中如何使用复杂对象参数。

这里的参数分两类,一类是入参,一类是返回值。

复杂对象在并不像想象中那么简单,其中还有一些玄机。请看实例:

1、开发服务,统统在服务端

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

/**
* Java6开发的WebService服务端
*
* @author leizhimin 2009-11-16 10:24:13
*/
@WebService
public class Java6WS {

//返回一个复杂对象
        public UserBean doSomething1(String username, String address, boolean flag) {
                return new UserBean(username, address, flag);
        }

//接收一个复杂对象
        public String doSomething2(Foo foo) {
                return foo.toString();
        }

public static void main(String[] args) {
                //发布一个WebService
                Endpoint.publish("http://192.168.14.117:9999/java6ws/Java6WS", new Java6WS());
        }
}

/**
* 用户信息
*
* @author leizhimin 2009-11-16 16:43:35
*/
public class UserBean {
        private String username;
        private String address;
        private boolean flag;

public UserBean() {
        }

public UserBean(String username, String address, boolean flag) {
                this.username = username;
                this.address = address;
                this.flag = flag;
        }

public String getUsername() {
                return username;
        }

public void setUsername(String username) {
                this.username = username;
        }

public String getAddress() {
                return address;
        }

public void setAddress(String address) {
                this.address = address;
        }

public boolean isFlag() {
                return flag;
        }

public void setFlag(boolean flag) {
                this.flag = flag;
        }

@Override
        public String toString() {
                return "UserBean{" +
                                "username=‘" + username + ‘\‘‘ +
                                ", address=‘" + address + ‘\‘‘ +
                                ", flag=" + flag +
                                ‘}‘;
        }
}

/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2009-11-16 17:09:46
*/
public class Foo {
        private String name;
        private String sex;

public Foo() {
        }

public Foo(String name, String sex) {
                this.name = name;
                this.sex = sex;
        }

public String getName() {
                return name;
        }

public void setName(String name) {
                this.name = name;
        }

public String getSex() {
                return sex;
        }

public void setSex(String sex) {
                this.sex = sex;
        }

@Override
        public String toString() {
                return "Foo{" +
                                "sex=‘" + sex + ‘\‘‘ +
                                ", name=‘" + name + ‘\‘‘ +
                                ‘}‘;
        }
}

2、生成客户端代码

可以清楚的看出,在客户端代码中,已经生成了服务接口和服务实现类,还生成了UserBean和Foo两个类,而这两个类和服务端的内容不同。

3、写客户端测试代码

import lavasoft.wsclient.Foo;
import lavasoft.wsclient.Java6WS;
import lavasoft.wsclient.Java6WSService;
import lavasoft.wsclient.UserBean;

/**
* 测试Java6 WS生成的客户端代码
*
* @author leizhimin 2009-11-16 17:05:00
*/
public class TestClient {
        public static void main(String[] args) {
                //创建一个客户端服务对象
                Java6WS java6WS = new Java6WSService().getJava6WSPort();

System.out.println("----------java6WS.doSomething1-------------");
                //调用服务方法,并得到方法返回值
                UserBean userBean = java6WS.doSomething1("zhangsan", "华中路", true);
                //打印服务的返回值
                System.out.println(userBean.toString());
                System.out.println(userBean.getUsername() + " " + userBean.getAddress() + " " + userBean.isFlag());

System.out.println("----------java6WS.doSomething2-------------");
                Foo f = new Foo();
                f.setName("李四");
                f.setSex("Man");
                String sf = java6WS.doSomething2(f);
                System.out.println(sf);
        }
}

4、执行客户端

执行前先启动服务端。

执行结果如下:

可以看出,测试很成功。

5、总结

这里面其实有些细节,需要说明白:

1)、对于复杂对象,必须有一个不带参数的构造方法。

2)、服务端覆盖Object的方法不能在客户端复原,比如toString方法。

3)、服务端的带参数构造方法在客户端失效。

以上三点是非常重要的,如果不知道会很郁闷,老出错还找不到原因。

时间: 2024-10-08 11:40:25

Java6 WebService 使用复杂对象的相关文章

【Java】Java6 WebService的发布

WebService服务发布往往比较混乱,Axis2的发布形式与XFire发布方式差别很大,而Java6 Web服务的发布与Axis2.XFire的Web服务的发布方式也有着天壤之别,它们之间没有经验可以借鉴. 因此,很有必要钻研下Java6的Web服务的发布方式. 从前面两篇文章可以看出Java6对WebService的发布提供了API级别的直接支持,发布只需要一行代码就搞定了.但是作为一个服务,就需要启动,总不能每次启动都去运行一个Main方法来启动吧. 实际中Web服务的发布常常伴随着We

Xfire实现webservice时,对象传递规则及解析简析

Xfire实现webservice,传递对象解析的话,要分两种情况处理:1.基本类型对象:2.复杂对象 其实,在客户端直接传递数组,如String[] int[]等这些无法通过配置具体类型来通知xfire的,都需要封装到一个新的自定义对象中来传递 1.基本数据对象 包括基本数据类型,还有其常用类String  Integer等,也有list或者map里包装的是基本类型或者自定义对象中属性都为基本类型的话, 是不需要配置xfire客户端就可以解析到服务端返回的数据 2.对于传递复杂的数据,比如Li

Java6 WebService的发布

Java6 WebService的发布 WebService服务发布往往比较混乱,Axis2的发布形式与XFire发布方式差别很大,而Java6 Web服务的发布与Axis2.XFire的Web服务的发布方式也有着天壤之别,它们之间没有经验可以借鉴. 因此,很有必要钻研下Java6的Web服务的发布方式. 从前面两篇文章可以看出Java6对WebService的发布提供了API级别的直接支持,发布只需要一行代码就搞定了.但是作为一个服务,就需要启动,总不能每次启动都去运行一个Main方法来启动吧

Java6 WebService客户端封装

在开发WebService客户端应用的时候,面临的最大挑战是事先不知道服务端要部署在哪里,端口是什么,因此Hello World的例子并不适合生产环境,还需要进一步的做改进. 改进的总体思想是将静态的部分替换为动态的,也就是说,将服务的ip和端口,做成动态参数,然后根据服务端的部署灵活改变这些配置参数. 下面针对前面的例子对客户端做一个改进. 1.写WebService服务的配置参数文件 wscfg.properties #Java6WS服务的配置 Java6WS.wsip=192.168.14

Android调用WebService系列之对象构建传递

上一篇我们讲了如何封装Android调用WebService的能力,把上一章的类加入我们便有了与WebService通讯的能力.往往我们会遇到WebService调用是通过对象来进行实际交互调用的.于是便有了这一章构建对象传递. 首先我们了解一下. Ksoap2这个开源包里面提供了一个接口 /* Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany  *  * Permission is hereby grant

java代码调用使用cxf搭建的webService服务传递对象

前边成功创建好一个cxf的webServcie服务,并带了一个无参数的方法.现在进一步尝试了使用带参数的方法,分别测了用String为参数和用自定义的对象为参数. 其中,使用String为参数时和不带参数的写法没有什么区别,调用时也就是很普通的调用.但是调用自定义对象为参数的方法时,实际数据并没有传递成功,于是在网上搜索一番后找到了解决办法,成功实现这一功能. 具体实现步骤大致如下: 1.在服务项目中添加一个自定义的类: package models; public class UserMode

java webservice服务器端获取request对象的三种方式

有的时候在webservice里我们需要获取request对象和response对象,比如想要获得客户端的访问ip的时候就需要这么做,下面说三种方式,当然三种方式可能是针对不同方式部署webservice获取request对象的方法. 第一种:先配置注入: @Resource private WebServiceContext webServiceContext; 其次是下面的代码: MessageContext mc = webServiceContext.getMessageContext(

Java6开发WebService进阶

在上文中,使用Java6做了一个最简单的WebService服务的实现,并通过Java6API发布了该服务. 在本文中,将看到如何使用Java6来做一个WebService服务,并如何使用Java6提供的开发工具来生成客户端代码,并调用服务. 一.服务端代码 import javax.jws.WebService; import javax.xml.ws.Endpoint; /** * Java6开发WebService入门 * * @author leizhimin 2009-11-13 16

【转】Java6开发WebService进阶

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lavasoft.blog.51cto.com/62575/226581 Java6开发WebService进阶 在上文中,使用Java6做了一个最简单的WebService服务的实现,并通过Java6API发布了该服务. 在本文中,将看到如何使用Java6来做一个WebService服务,并如何使用Java6提供的开发工具来生成客户端代码,并调用服务. 一.服务端代码 pack