`

WebService CXF中传递复杂类型对象

阅读更多

前面一篇文章介绍的都是传递简单的字符串,现在开始介绍传递复杂类型的对象。如JavaBean、Array、List、Map等。

如有不正确之处,请各位给予指出!

 

1、 首先看看服务器端的代码所需要的JavaBean对象

package com.wy.object.entry;

import java.io.Serializable;

/**
 * User Entity
 * @author Administrator
 *
 */
public class User implements Serializable {

	private static final long serialVersionUID = 1L;

	private int id;
	private String name;
	private String email;
	private String address;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAddress() {
		return address;
	}

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

	@Override
	public String toString() {

		return this.id + " - " + this.name + " - " + this.address + " - "
				+ this.email;

	}
}

 下面的是集合传递Users,CXF直接传递集合对象会出现异常,用一个对象包装下就Ok了,不知道是什么原因。

package com.wy.object;

import java.util.HashMap;
import java.util.List;

import com.wy.object.entry.User;

/**
 * CXF直接传递集合对象会出现异常,用一个对象包装下就Ok了,不知道是什么原因?
 * 
 * @author Administrator
 * 
 */
public class Users {
	private List<User> users;
	private User[] userArr;
	private HashMap<String, User> maps;
	public List<User> getUsers() {
		return users;
	}

	public void setUsers(List<User> users) {
		this.users = users;
	}

	public User[] getUserArr() {
		return userArr;
	}

	public void setUserArr(User[] userArr) {
		this.userArr = userArr;
	}

	public HashMap<String, User> getMaps() {
		return maps;
	}

	public void setMaps(HashMap<String, User> maps) {
		this.maps = maps;
	}

}

 

2、 下面看看复杂对象传递的服务器端代码

 

interface:

 

package com.wy.object.server;

import javax.jws.WebParam;
import javax.jws.WebService;

import com.wy.object.Users;
import com.wy.object.entry.User;
/**
 * 定制客户端请求WebService所需要的接口
 * @author Administrator
 *
 */

@WebService
public interface IUserService {
	public User getUserByName(@WebParam(name = "name") String name);
	public void setUser(User user);
	public Users getUsers(int i);
	public void setUsers(Users users);
	public Users getUserArray(int i);
	public void setUserArray(Users users);
	public void setUserMap(Users maps);
	public Users getUserMap();
}

 

接口实现类:

package com.wy.object.server.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

import com.wy.object.Users;
import com.wy.object.entry.User;
import com.wy.object.server.IUserService;

/**
 * WebService传递复杂对象,如JavaBean、Array、List、Map等
 * 
 * @author Administrator
 * 
 */

@WebService(endpointInterface = "com.wy.object.server.IUserService", serviceName = "IUserService")
@SOAPBinding(style = Style.RPC)
@SuppressWarnings("deprecation")
public class UserService implements IUserService {

	// string
	public User getUserByName(@WebParam(name = "name")
	String name) {
		User user = new User();
		user.setId(new Date().getSeconds());
		user.setName(name);
		user.setAddress("China BeiJing");
		user.setEmail(name + "@163.com");
		return user;
	}

	// object JavaBean
	public void setUser(User user) {
		System.out.println("@@@@@@@@@@@@ Server setUser @@@@@@@@@@@");
		System.out.println("setUser:" + user);
	}

	// 传递集合的包装对象 List
	public Users getUsers(int i) {
		List<User> users = new ArrayList<User>();
		for (int j = 0; j <= i; j++) {
			User user = new User();
			user.setId(new Date().getSeconds());
			user.setName("Sun#" + j);
			user.setAddress("China");
			user.setEmail("Sun" + j + "@163.com");

			users.add(user);

		}
		Users u = new Users();
		u.setUsers(users);
		return u;
	}

	public void setUsers(Users users) {
		System.out.println("############ Server setUsers ###########");
		for (User u : users.getUsers()) {
			System.out.println("setUsers:" + u);
		}
	}

	// 传递集合的包装对象 Array
	public Users getUserArray(int i) {
		User[] users = new User[i];
		for (int j = 0; j < i; j++) {
			User user = new User();
			user.setId(new Date().getSeconds());
			user.setName("Jack#" + j);
			user.setAddress("China");
			user.setEmail("Jack" + j + "@163.com");

			users[j] = user;
		}
		Users u = new Users();
		u.setUserArr(users);
		return u;
	}

	public void setUserArray(Users users) {
		System.out.println("$$$$$$$$$$$$ Server setUserArray $$$$$$$$");
		for (User u : users.getUserArr()) {
			System.out.println("setUserArray:" + u);
		}
	}

	// 传递集合的包装对象 Map
	public void setUserMap(Users maps) {
		System.out.println("------------ Server setUserMap ----------");
		System.out.println("setUserMap:" + maps.getMaps());
	}

	public Users getUserMap() {
		HashMap<String, User> users = new HashMap<String, User>();
		User user = new User();
		user.setId(new Date().getSeconds());
		user.setName("Jack#");
		user.setAddress("China#");
		user.setEmail("Jack@163.com");

		users.put("A", user);
		user = new User();
		user.setId(new Date().getSeconds());
		user.setName("Tom");
		user.setAddress("China$$");
		user.setEmail("Tom@163.com");

		users.put("B", user);
		Users u = new Users();
		u.setMaps(users);

		return u;
	}
}

 

3、 发布WebService的代码

package com.wy.object;

import javax.xml.ws.Endpoint;

import com.wy.object.server.impl.UserService;
/**
 * 发布UserService服务
 * @author Administrator
 *
 */
public class DeployUserService {
	public static void main(String[] args) throws InterruptedException {
		String address = "http://localhost:8080/WebServiceCXF/services/IUserService";
		UserService service = new UserService();
		Endpoint.publish(address, service);
		System.out.println("Server ready...");
		Thread.sleep(1000 * 60 * 20);
		System.out.println("Server exit...");
		System.exit(0);
	}
}

 

4、 客户端调用代码

 

package com.wy.object.client;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.wy.object.Users;
import com.wy.object.entry.User;
import com.wy.object.server.IUserService;

/**
 * 调用UserService客户端
 * 
 * @author Administrator
 * 
 */
public class UserServiceClient {
	public static void main(String[] args) {

		// 调用WebService
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IUserService.class);
		factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");
		IUserService service = (IUserService) factory.create();
		
		//string
		System.out.println("@@@@@@@@@@@@@Client getUserByName@@@@@@@@@@@@@@");
		User user = service.getUserByName("Jack");
		System.out.println("Client: "+ user);
		user.setAddress("China-BeiJing");
		
		//object JavaBean
		service.setUser(user);

		//传递集合的包装对象 List
		System.out.println("#############Client getUsers###################");
		Users users = service.getUsers(4);
		System.out.println("Client: "+ users);
		List<User> tempUsers = new ArrayList<User>();
		for (User u : users.getUsers()) {
			System.out.println("Client: "+ u);
			u.setName("Jack" + new Random().nextInt(100));
			u.setAddress("Chian-BeiJing#" + new Random().nextInt(100));
			tempUsers.add(u);
		}
		users.getUsers().clear();
		users.getUsers().addAll(tempUsers);
		
		service.setUsers(users);

		//传递集合的包装对象 Array
		System.out.println("$$$$$$$$$$$$Client getUserArray$$$$$$$$$$$$$$$");
		users = service.getUserArray(4);
		User[] userArr = new User[4];
		int i = 0;
		for (User u : users.getUserArr()) {
			System.out.println("Client: "+ u);
			u.setName("Jack" + new Random().nextInt(100));
			u.setAddress("Chian-ShenZhen#" + new Random().nextInt(100));
			userArr[i] = u;
			i++;
		}
		users.setUserArr(userArr);
		
		service.setUserArray(users);

		//传递集合的包装对象 Map
		System.out.println("------------Client getUserMap----------------");
		users = service.getUserMap();
		System.out.println("Client: "+ users.getMaps());
		users.getMaps().put("ABA", userArr[0]);
		service.setUserMap(users);

	}
}

 

 

 

分享到:
评论
9 楼 we0476 2013-03-10  
一样的文章贴来贴去 有意思没?
8 楼 we0476 2013-03-09  
请问你就没有配置web.xml之类的文件么?
7 楼 Itach 2012-11-16  
补充6楼:
服务端:
private List<Material> materials;

public void setMaterials(List<Material> materials){
this.materials = materials;
}

public void setMaterial(List<Material> materials){
this.materials = materials;
}

生成的客户端:
@XmlElement(nillable = true)
protected List<Material> materials;

public List<Material> getMaterials() {
        if (materials == null) {
            materials = new ArrayList<Material>();
        }
        return this.materials;
    }
无  setMaterials()  方法
6 楼 Itach 2012-11-16  
您好,请问CXF框架下,服务端实体类代码中有List类型的属性,在客户端生成的该类对应的代码只有getter方法,没有setter方法,该怎么解决。
5 楼 jiangli19192 2012-08-30  
如果在线的话,请联系我,qq:362503078
4 楼 jiangli19192 2012-08-30  
cxf能把对象转化成json格式输出,那服务端接收参数是对象,但是客户端传入的是json格式,能不能自动转换?
3 楼 萧_瑟 2012-03-30  
温柔的羊 写道
萧_瑟 写道
您好,请问你说的 :CXF直接传递集合对象会出现异常。这个异常指的是什么异常呢?是这个吗?
[javax.xml.bind.JAXBException: class xxxxxxxx nor any of its super class is known to this context.]

我通过JSON封装了一个Bean
String result = JSonDataFormatUtils.resultJSonFormat(object);

然后通过CXF webservice去获得这个json的result 数据就报出这个错了,你知道怎么解决吗?

如果不通过CXF,普通的方法调用就可以获得,不知道是什么原因。


把跟接口和实现类放到同一个包下面,试一试。
可能是cxf在object和xml转换的时候会默认在同一个包下面找。




还是不行。
2 楼 温柔的羊 2012-03-29  
萧_瑟 写道
您好,请问你说的 :CXF直接传递集合对象会出现异常。这个异常指的是什么异常呢?是这个吗?
[javax.xml.bind.JAXBException: class xxxxxxxx nor any of its super class is known to this context.]

我通过JSON封装了一个Bean
String result = JSonDataFormatUtils.resultJSonFormat(object);

然后通过CXF webservice去获得这个json的result 数据就报出这个错了,你知道怎么解决吗?

如果不通过CXF,普通的方法调用就可以获得,不知道是什么原因。


把跟接口和实现类放到同一个包下面,试一试。
可能是cxf在object和xml转换的时候会默认在同一个包下面找。
1 楼 萧_瑟 2012-03-29  
您好,请问你说的 :CXF直接传递集合对象会出现异常。这个异常指的是什么异常呢?是这个吗?
[javax.xml.bind.JAXBException: class xxxxxxxx nor any of its super class is known to this context.]

我通过JSON封装了一个Bean
String result = JSonDataFormatUtils.resultJSonFormat(object);

然后通过CXF webservice去获得这个json的result 数据就报出这个错了,你知道怎么解决吗?

如果不通过CXF,普通的方法调用就可以获得,不知道是什么原因。

相关推荐

    WebService CXF 对象传递 附

    **WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...

    webservice cxf 服务端客户端传递参数的例子demo

    下面我们将深入探讨"webservice CXF 服务端客户端传递参数的例子demo"。 1. **CXF框架介绍** CXF是一个Java框架,它允许开发者通过简单的API来创建和使用Web服务。CXF支持多种Web服务标准,如WS-I Basic Profile、...

    WebService_CXF实现及ANT

    2. CXF WebService中传递复杂类型对象: CXF允许在Web服务中传递复杂数据类型,如自定义的Java对象。这通常涉及到XML Schema(XSD)的使用,用于定义这些复杂类型的结构。通过JAXB(Java Architecture for XML ...

    WebService CXF

    在描述中提到的【详细配置及参数传递】是指在实现WebService时,我们需要对服务端进行一系列配置,并确保能够正确地接收和传递参数。以下是这些概念的详细说明: 1. **服务端配置**: - **JavaBean对象**:在示例...

    CXF WebService实例

    接下来,我们要讨论的是如何通过CXF传递复杂数据类型,如`List`和`Map`。CXF支持数据绑定,可以自动将Java对象转换为XML消息,反之亦然。在服务接口中,你可以定义接受或返回`List`或`Map`的方法,然后在实现中处理...

    WebService传递对象与集合问题.rar

    本资源"WebService传递对象与集合问题.rar"显然关注的是在Web Service中如何有效地传递复杂数据类型,如对象和集合。 在传统的Web Service中,数据通常通过XML格式进行传输,这是SOAP消息的基础。然而,直接传递...

    spring,cxf,restful发布webservice传递List,Map,List&lt;Map&gt;

    在IT行业中,Web服务是一...总的来说,结合Spring、CXF和RESTful,我们可以轻松地创建和消费传递复杂对象的Web服务,这在分布式系统和微服务架构中尤其有用。理解并熟练掌握这些技术,对于提升你的IT职业生涯至关重要。

    cxf webservice demo

    总的来说,这个"CXF Webservice Demo"是一个完整的示例,涵盖了从基础的字符串传递到复杂的对象交换,以及与Spring的集成。通过学习和理解这个示例,开发者能够更好地掌握如何在实际项目中使用CXF来创建高效、灵活且...

    CXF WebService 开发指南、技术文档

    CXF支持在WebService中传递复杂类型的对象,这通常通过序列化对象为XML实现。复杂类型可以是自定义的Java类,也可以是POJO(Plain Old Java Object)。 1. **定义复杂类型**: - 使用`@XmlRootElement`注解定义根...

    CXF实现webservice

    SOAP是一种基于XML的消息传递协议,适用于需要强类型和事务处理的复杂环境。CXF支持基于JAX-WS的标准API来创建SOAP服务,开发者可以使用注解或者XML配置文件定义服务接口和服务实现。 #### 2.2 RESTful Web服务 ...

    CXF webService 工具类

    - **数据绑定**:帮助将XML消息自动映射到Java对象,反之亦然,减少手动处理XML的复杂性。 - **错误处理**:提供异常处理机制,便于捕获和处理服务调用中的错误。 4. **使用CXF工具类的步骤** - **添加依赖**:...

    WebService_CXF学习

    在这个例子中,`Customer`类将作为Web服务参数进行传递,通过CXF框架,开发者可以轻松地在服务端和客户端之间交换复杂的数据对象,实现了Java对象到XML的自动转换和反转换,简化了Web服务开发的复杂度。通过这样的...

    04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值

    在本文中,我们将深入探讨如何使用Apache CXF框架来处理JavaBean式的复合类型以及List集合类型的参数和返回值。CXF是一个开源的、强大的Web服务框架,它支持多种Web服务标准,包括SOAP、RESTful等,并且允许开发者以...

    CXF-WebService-开发指南、技术文档.docx

    **四、CXF WebService 中传递复杂类型对象** CXF允许在Web服务中传递复杂类型的对象,这通常涉及到数据绑定(Data Binding)。CXF支持JAXB(Java Architecture for XML Binding)来自动将XML与Java对象进行映射。...

    Cxf应用整理学习资料

    在本节中,我们将介绍如何在CXF中传递复杂对象。首先,我们需要定义一个实体类`Demo`,用于存储各种复杂数据类型: ```java public class Demo { private String name; private int age; private List&lt;Integer&gt; ...

    cxf webserice 开发指南

    **四、CXF WebService 中传递复杂类型对象** 除了基本类型,CXF还支持在Web服务中传递复杂类型对象。你可以定义Java类来表示这些复杂类型,并在服务接口中作为参数或返回值。CXF会自动处理这些对象的序列化和反序列...

    apache-cxf-2.1.4及教程

    传递复杂类型对象是CXF的一个重要特性。在传统的Web服务中,我们通常只能传递简单类型如字符串、整数等。然而,CXF支持XML Schema定义的复杂数据类型,这意味着你可以直接传递和接收Java对象,这极大地简化了服务...

    CXF_webService所需jar包

    在Java世界中,CXF是一个广泛使用的工具,因为它提供了丰富的功能和良好的性能。 CXF支持两种主要的Web服务规范:SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)。SOAP是一种...

Global site tag (gtag.js) - Google Analytics