`
阅读更多

cxf Map参数,cxf webservice复杂参数

 

================================

©Copyright 蕃薯耀 2018年5月18日

http://fanshuyao.iteye.com/

 

一、问题描述:

cxf 的服务方法中,是不能使用java.util.Map作为参数的,因为本身不支持转换

 

二、解决方案

1、自定义对象实体参数,然后再通过自定义适配器进行转换,该适配器需要继承XmlAdapter类,实现里面2个方法,如下:

 

public class RowImplAdapter extends XmlAdapter<AdapterData, RowImpl>{
	
	@Override
	public RowImpl unmarshal(AdapterData adapterData) throws Exception {
		RowImpl rowImpl = new RowImpl();
		List<AdapterEntity> entities = adapterData.getEntities();
		for (AdapterEntity adapterEntity : entities) {
			rowImpl.addColumn(adapterEntity.getKey(), adapterEntity.getValue());
		}
		return rowImpl;
	}

	@Override
	public AdapterData marshal(RowImpl rowImpl) throws Exception {
		AdapterData adapterData = new AdapterData();
		@SuppressWarnings("unchecked")
		Set<Map.Entry<String, Object>> set = rowImpl.entrySet();
		for (Map.Entry<String, Object> entry : set) {
			adapterData.getEntities().add(new AdapterEntity(entry.getKey(), entry.getValue()));
		}
		return adapterData;
	}
	
}
 

 

AdapterData:

 

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

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

@XmlType(name="AdapterData")
@XmlAccessorType(XmlAccessType.FIELD)
public class AdapterData {
	private List<AdapterEntity> entities = new ArrayList<AdapterEntity>();

	public List<AdapterEntity> getEntities() {
		return entities;
	}

	public void setEntities(List<AdapterEntity> entities) {
		this.entities = entities;
	}
	
}
 

 

AdapterEntity:(其实这个实体就是仿照Map的键值对形式)

 

public class AdapterEntity{
	private String key;
	private Object value;
	public AdapterEntity() {
		super();
	}
	public AdapterEntity(String key, Object value) {
		super();
		this.key = key;
		this.value = value;
	}
	
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public Object getValue() {
		return value;
	}
	public void setValue(Object value) {
		this.value = value;
	}

}
 

 

2、webservice服务方法需要在转换的参数添加一个注解(@XmlJavaTypeAdapter),如下

 这个注解是加在接口的方法上,不是在实体的方法。

@WebMethod (operationName="xxx")
	public String xxx(@WebParam @XmlJavaTypeAdapter(RowImplAdapter.class) RowImpl rowImpl) throws Exception; 

 

3、客户端使用JaxWsDynamicClientFactory 调用

public void findPlaceNameList(HttpServletRequest request,HttpServletResponse response) throws Exception{
		String result = "{}";
		try {
			Row row = parseRequestParametersToRow(request);
			
			Properties  prop = PropertiesUtils.read("placeNameServerURL.properties");
			String ghyw_url = PropertiesUtils.readKeyValue(prop, "ghyw_url");
			String webservice_prefix = PropertiesUtils.readKeyValue(prop, "webservice_prefix");
			String webservice_url = PropertiesUtils.readKeyValue(prop, "webservice_url");
			
			JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
			Client client = clientFactory.createClient(ghyw_url + webservice_prefix +webservice_url);
			Object[] results = client.invoke("webservice方法名", CxfAdapterUtils.rowToAdapterData(row));
			if(results != null){
				result = (String) results[0];
				System.out.println("result="+result);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			writeJson(response, result);
		}
	}

 

 4、客户端调用时,参数需要转换,即把Row对象转换成AdapterData对象,然后再传过去

CxfAdapterUtils.rowToAdapterData(row)对应的工具类,如下:

import java.util.Map;
import java.util.Set;

import com.plan.commons.Row;
import com.plan.commons.RowImpl;

/**
 * cxf 适配器工具 类
 *
 */
public class CxfAdapterUtils {

	/**
	 * 将Row转换成AdapterData对象
	 * @param row
	 * @return
	 */
	public static AdapterData rowToAdapterData(Row row){
		AdapterData adapterData = new AdapterData();
		@SuppressWarnings("unchecked")
		Set<Map.Entry<String, Object>> set = row.entrySet();
		for (Map.Entry<String, Object> entry : set) {
			adapterData.getEntities().add(new AdapterEntity(entry.getKey(), entry.getValue()));
		}
		return adapterData;
	};
}

 

 

三、总结

其实这样转换挺复杂的,感觉吃力不讨好。

个人觉得还是使用json工具类,把需要传递过去的复杂对象转换成json后,然后以字符串的形式传递过去,服务端通过json工具再解析成对象,这样方便很多,也不用太折腾。

 

================================

©Copyright 蕃薯耀 2018年5月18日

http://fanshuyao.iteye.com/

1
0
分享到:
评论
1 楼 蕃薯耀 2018-05-21  
cxf Map参数,cxf webservice复杂参数

==========
蕃薯耀

相关推荐

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

    本文将深入探讨如何使用这些技术来发布Web服务,特别是涉及复杂对象如List、Map及List&lt;Map&gt;的传递。 首先,Spring框架是一个Java企业级应用开发的强大工具,它提供了众多模块,包括Spring MVC用于Web开发。在Spring...

    cxf-webservice复杂类型

    **标题:“cxf-webservice复杂类型”** 在Web服务领域,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费各种类型的Web服务,包括处理复杂的类型数据。本主题将深入探讨CXF如何处理像Map这样的Java集合...

    CXF WebService实例

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

    17.4 webservice map参数详解1

    本篇主要讨论的是如何在CXF框架下处理Map类型的参数,因为默认情况下,CXF并不直接支持Map的解析。 1. **Map类型在WebService中的挑战** - CXF作为Java的Web服务框架,虽然提供了丰富的数据类型支持,但默认并不...

    cxf开发map的demo

    【描述】"本资源是java_cxf对应Map类型的代码优先的开发demo"意味着开发者可能在服务接口中定义了一个接收或返回Map参数的方法,并在实际的Java代码中实现了这些接口。Map是Java中的一个重要数据结构,它可以存储...

    详解Spring boot+CXF开发WebService Demo

    Spring Boot + CXF 开发WebService Demo 详解 Spring Boot 和 Apache CXF 是两个非常流行的Java 框架,前者是一个基于 Spring 的框架,后者是一个提供了强大 web 服务支持的框架。本文将详细介绍如何使用 Spring ...

    Apache Cxf WebService整合Spring

    Apache Cxf WebService整合Spring 处理Map、非javabean式的复合类等CXF无法自动转化的类型 CXF为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志

    cxf,webservice实例

    webservice客户端与服务端实例,可以运行,java代码编写,发布方式有两种,1为cxf集成到spring 通过tomcat 发布,2为endpoint方式以main方法运行。 提供了返回常用的基本数据类型和map,list,javabean 4个接口服务 ...

    07.处理Map等CXF无法自动转换的复合数据类型的形参和返回值

    然而,CXF在默认情况下并不支持所有类型的复杂数据类型,尤其是如Map、List这样的集合类型。当我们在服务接口中使用这些类型作为参数或返回值时,可能会遇到问题,因为CXF可能无法正确地序列化和反序列化它们。 ...

    Cxf应用整理学习资料

    除了简单的数据类型,CXF还支持复杂的对象传递,如List、Map等集合类型。这通常涉及到序列化和反序列化的过程。 在本节中,我们将介绍如何在CXF中传递复杂对象。首先,我们需要定义一个实体类`Demo`,用于存储各种...

    Apache CXF 资料搜集

    5. **Apache CXF入门范例以及对传递ListMap类型的疑惑**:这篇资料可能讨论了在使用CXF时遇到的具体问题,例如如何处理复杂的数据类型,如List&lt;Map, Object&gt;&gt;。在Web服务中,复杂类型的序列化和反序列化可能需要特别...

    cxf_axis_xfire客户端调用的几种方法.docx

    在这个例子中,`TestService`接口定义了Web服务的四个方法,包括接收字符串参数的`sayHi`,以及处理Map和List类型的`getMap`和`getUser`。 **适配器类:** 在Web服务中,Map类型的参数通常不直接支持。因此,我们...

    CXF应用整理(包括大文件上传MTOM、安全机制)

    本篇文章将深入探讨 CXF 的一些核心功能,包括简单的 HelloWorld 示例、复杂对象的传递、安全机制以及大文件上传(MTOM)。 ### 1. CXF HelloWorld 示例 创建一个简单的 CXF 服务,首先要定义一个服务接口,使用 `...

    CXF代码总结(2013-6-5)

    在CXF中,你可以直接传递Map对象作为参数或返回值。例如,服务方法可以接受一个Map,然后在客户端中创建并传递Map: ```java @WebService public interface MyWebService { Map, Object&gt; processMap(Map, Object&gt; ...

    CXFServer(集成spring)

    除了基本数据类型,CXFServer还支持处理复杂的自定义数据类型,如对象、数组、Map等。这意味着服务可以处理更复杂的业务逻辑,比如用户信息管理、订单处理等,这些通常涉及到多个属性或结构的数据交换。开发者可以...

    cxf_axis_xfire客户端调用的几种方法[收集].pdf

    在本文中,我们将重点关注CXF客户端调用Web服务的方法,特别是处理Map类型参数的问题。 首先,CXF客户端调用Web服务时,通常会通过服务接口类来实现。在给出的示例中,`TestService`接口定义了几个服务方法,如`...

    webservice基础学习

    WebService小白学习,处理JavaBean以及复合类型,list,处理一些Map等复杂类型, CXF添加拦截器,自定义拦截器等等。 博客学习地址:https://blog.csdn.net/qq_37902949/article/details/81262826

    java调用wsdl接口源码-cxf-plus:apachecxf在支持通用数据类型方面的增强

    简化集成,针对目前大多数服务使用SpringFramework的特点,自动查找JAX-WS和JAX-RS注解进行服务发布,用户只需配置一个Servlet即可发布WebService。 运维支持:支持在日志输出报文,报文格式化等,便于开发调试。...

    17.3、自己之前的webservice1

    9. **参数和结果类型**: 当接口函数的返回值为复杂类型(如Map),客户端生成的代码会包含一个内部类,对应于函数名。服务端实现该方法,返回Map对象。 ```java @Override public Map, Student&gt; getAllStudentsMap...

    Spring boot 整合CXF开发web service示例

    private Map, User&gt; userMap = new HashMap, User&gt;(); public UserServiceImpl() { User user = new User(); user.setUserId(10001L); user.setUsername("liyd1"); user.setEmail("liyd1@qq.com"); user....

Global site tag (gtag.js) - Google Analytics