Java6 WebService 使用复杂对象
复杂对象可表示的语义比简单对象强大很多,这里看看在Java6的WebService中如何使用复杂对象参数。
这里的参数分两类,一类是入参,一类是返回值。
复杂对象在并不像想象中那么简单,其中还有一些玄机。请看实例:
1、开发服务,统统在服务端
package lavasoft.server;
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());
}
}
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());
}
}
package lavasoft.server;
/**
* 用户信息
*
* @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 +
'}';
}
}
/**
* 用户信息
*
* @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 +
'}';
}
}
package lavasoft.server;
/**
* 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 + '\'' +
'}';
}
}
/**
* 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、写客户端测试代码
package lavasoft;
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);
}
}
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)、服务端的带参数构造方法在客户端失效。
以上三点是非常重要的,如果不知道会很郁闷,老出错还找不到原因。
本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/228152
发表评论
-
WebService大讲堂之Axis2(10):使用soapmonitor模块监视soap请求与响应消息
2011-06-16 17:07 745在Axis2中提供了一个Axis2 ... -
http://androidguy.blog.51cto.com/974126/214862
2011-06-16 17:06 781Axis2可以通过模块(Module)进行扩展。Axis2模块 ... -
WebService大讲堂之Axis2(8):异步调用WebService
2011-06-16 17:05 778在前面几篇文章中都是使用同步方式来调用WebService。也 ... -
WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService
2011-06-16 17:05 1105在现今的Web应用中经常使用Spring框架来装载JavaBe ... -
WebService大讲堂之Axis2(6):跨服务会话(Session)管理
2011-06-16 17:00 861在《WebService大讲堂之Axis2(5):会话(Se ... -
WebService大讲堂之Axis2(5):会话(Session)管理
2011-06-16 17:00 794WebService给人最直观的感觉就是由一个个方法组成,并在 ... -
WebService大讲堂之Axis2(4):二进制文件传输
2011-06-16 16:59 853在《WebService大讲堂之Axis2(2):复合类型数据 ... -
WebService大讲堂之Axis2(3):使用services.xml文件发布WebService
2011-06-16 16:58 727用Axis2实现Web Service,虽然可以将POJO类放 ... -
WebService大讲堂之Axis2(2):复合类型数据的传递
2011-06-16 16:57 925在实际的应用中,不仅需要使用WebService来传递简单类型 ... -
WebService大讲堂之Axis2(1):用POJO实现0配置的WebService
2011-06-16 16:57 759Axis2是一套崭新的WebService引擎,该版本是对Ax ... -
Java6 WebService 使用集合
2011-06-16 16:52 853集合是一种非常有用的 ... -
Java6 WebService客户端封装
2011-06-16 16:50 1077在开发WebService客户端应用的时候,面临的最大挑战是事 ... -
Java6 WebService的发布
2011-06-16 16:49 905WebService服务发布往往比较混乱,Axis2的发布形式 ... -
Java6开发WebService进阶
2011-06-16 16:47 1128在上文中,使用Java6做 ... -
Java6开发WebService入门
2011-06-16 16:17 827之前常常用CXF、Axis2、XF ...
相关推荐
在“java 利用webservice传输文件”的场景中,JACOB可能被用来执行以下任务: 1. **文件操作**:Windows系统有许多内置的COM组件,如Scripting.FileSystemObject,可用于读写文件、创建目录等。通过JACOB,Java程序...
本文将详细介绍如何使用Apache Axis库来实现这一功能,以及处理.NET WebService返回的对象,特别是Dataset类型。 首先,为了在Java中调用.NET WebService,我们需要以下依赖库: 1. axis.jar - Apache Axis的核心...
#### 使用Java和Tomcat部署WebService 在本实例中,我们采用的是Apache Axis作为WebService框架。Apache Axis是一个开源的、功能强大的Web服务实现,支持SOAP协议,能够简化WebService的创建、发布和调用过程。 **...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而动态调用Web服务和复杂对象的序列化、反序列化是开发过程中常见的技术环节。本文将深入探讨这两个主题。 首先,让我们理解什么是动态调用Web服务。Web...
以下是如何使用Axis进行Java调用WebService接口的步骤: 1. **创建WebService客户端**: 首先,你需要获取服务的WSDL文档。这是一个XML文件,描述了服务的接口、操作和消息格式。你可以通过URL获取WSDL,或者如果...
这个工程详细的介绍了webService服务客户端如何调用简单和复杂的webService,其中就包括传递的参数是对象类型,返回数据是数组类型,还有最简单的基本类型。压缩包里还配置说明,清晰的说明webService的整个过程,对...
最后,我们将使用 `OdiInvoke` 对象的 `getOdiInvokeRequestSOAP11Port0()` 方法获取一个 `RequestPortType` 对象,并使用该对象的 `invokeStartScen()` 方法调用 ODI webservice。 在调用 ODI webservice 之后,...
1. **Service Endpoint Interface (SEI)**:定义Web服务的公共接口,使用Java注解来指定服务的命名空间、地址等信息。 2. **ServiceImpl类**:实现SEI接口,提供服务的具体逻辑。 3. **WSDL生成**:根据SEI自动生成...
JAX-WS继承并改进了早期的JAX-RPC(Java API for XML Remote Procedure Call)规范,提供了更加简洁和面向对象的编程模型。JAX-WS能够通过注解简化Web服务的开发过程,并且支持Web服务的动态客户端编程,即客户端...
【Java调用WebService客户端详解】 在Java开发中,有时我们需要从客户端调用远程的WebService服务以获取或传递数据。本文将详细介绍如何使用Java进行WebService客户端的调用,并提供HttpGet、HttpPost、HttpSoap...
在涉及到复杂对象如列表或自定义模型时,通常会使用JSON格式进行传输,因为它更轻量且易于解析。在C#中,我们可以使用Newtonsoft.Json库将实体对象序列化为JSON字符串,然后在Android端反序列化为Java对象。 服务端...
- **SAAJ(SOAP with Attachments API for Java)**是与JAXM配合使用的API,为构建和解析SOAP消息提供了支持,特别是在处理带有附件的SOAP消息时尤为重要。SAAJ的API位于`javax.xml.soap.*`包。 - 相比于JAX-WS,...
在本实例中,我们将深入探讨使用Apache Axis实现Web服务,特别是处理复杂对象的传递。 Apache Axis是Apache软件基金会开发的一个开源工具,它为Java开发者提供了一个方便的框架来创建和部署Web服务。Axis使得开发、...
通过这个简单的Java WebService入门实例,我们可以了解到如何使用Java来创建、发布和调用一个基本的WebService。实际开发中,WebService还涉及到更多复杂的应用,如安全性、事务处理、错误处理等,这些都是进阶学习...
WebService是一种通过网络进行通信的软件系统,使用SOAP(简单对象访问协议)进行消息传输,WSDL描述了服务的接口和绑定,UDDI(统一描述、发现和集成)则用于服务的注册和查找。 2. **JAX-WS(Java API for XML ...
在给定的"java调用webservice最精简的jar包"压缩文件中,可能就包含了这些基本组件,使得开发者能够快速、简洁地完成Web服务调用任务。在实际使用时,应根据项目的具体需求和环境,适当地添加或移除这些JAR包。
综上所述,`CallWebServiceClientDemo`演示了如何使用Java通过JAX-WS调用Web Service的全过程,涵盖了从获取WSDL、生成Stub、实例化服务、调用方法到异常处理等多个关键环节。理解并实践这个Demo,对于掌握Java调用...
在Java中,通常使用JAX-WS(Java API for XML Web Services)或者JAX-RS(Java API for RESTful Web Services)来创建和消费WebService。 3. 定时任务:在Java中,有多种方式可以实现定时任务,如使用java.util....
**WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...
总的来说,通过Apache Axis,Java开发者可以便捷地实现对WebService的调用,大大简化了与远程服务交互的复杂性。在实际项目中,根据具体的业务需求,可能还需要处理认证、加密、性能优化等问题,这些都是在调用...