`
qq1988627
  • 浏览: 105931 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

类转换

    博客分类:
  • Java
 
阅读更多
package zxc.utils;

import java.lang.reflect.Member;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.springframework.util.StringUtils;

import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ObjectTypeDeterminer;
import com.opensymphony.xwork2.util.XWorkBasicConverter;
import com.opensymphony.xwork2.util.XWorkConverter;

public class CustomShareConverter extends XWorkBasicConverter {
	public static final String		SEQUENCE_SEPARATOR	= ",";

	public static final String		MAP_SEPARATOR		= ":";

	private ObjectTypeDeterminer	objectTypeDeterminer;

	@Inject
	public void setObjectTypeDeterminer(ObjectTypeDeterminer det) {
		this.objectTypeDeterminer = det;
	}

	/**
	 * 这里的toType一定是一个在配置文件将此转换器作为它的转换器的类或者是String类
	 */
	@SuppressWarnings("unchecked")
	@Override
	public Object convertValue(Map context, Object target, Member member, String property, Object value, Class toType) {
		if (value == null || toType == String.class || ((String[]) value).length != 1) {
			//注意第一个条比较怪,具体解释是:1.如果为null交给超类;2.如果向前台转,也交给超类;
			//3.前台向后台转,且value不为null,但是前台传递同一个name多于一个值,则仍然使用超类转换
			return super.convertValue(context, target, member, property, value, toType);
		} 
		String strValue = ((String[]) value)[0];//我现存在认为只要前台传值至少会有一个元素,放在这个表达式在这里确认一下
		if (toType == Boolean.class) {
			if (value == null || !StringUtils.hasText(strValue) || "null".equals(strValue)) {
				return null;
			} else if ("true".equals(strValue) || "1".equals(strValue)) {
				return Boolean.TRUE;
			} else {//注意:除去true,1,与null全部返回false
				return Boolean.FALSE;
			}
		} else if (toType.isArray() || Collection.class.isAssignableFrom(toType)) {//向台向后台转,并且是单参数(即序列转数组)
			String sequence = strValue;
			if (!StringUtils.hasText(sequence)||"null".equals(sequence)) {
				return null;//对序列情况的处理
			}
			//这里重写了拆分逻辑
			value = new SequenceSplitor(sequence).split(SEQUENCE_SEPARATOR.charAt(0));
			return super.convertValue(context, target, member, property, value, toType);
		} else if (Map.class.isAssignableFrom(toType)) {
			//超类并没有给出对map情况的处理,这里直接将它处理掉,但是map中的成员仍然是依赖超类处理
			return convertToMap(context, target, member, property, value, toType);
		}
		
		throw new RuntimeException("预期外的类型");
	}

	//将一个序列转换成一个Map
	private Object convertToMap(Map<?, ?> context, Object target, Member member, String property, Object value, Class<?> toType) {
		String sequence = ((String[]) value)[0];
		String[] splitArray = new SequenceSplitor(sequence).split(SEQUENCE_SEPARATOR.charAt(0));

		Class<?> keyClass = String.class;
		Class<?> valueClass = String.class;
		if (target != null) {
			keyClass = this.objectTypeDeterminer.getKeyClass(target.getClass(), property);
			valueClass = this.objectTypeDeterminer.getElementClass(target.getClass(), property, null);
		}
		Map<Object, Object> map = createMap(context, target, member, property, value, toType, splitArray.length);
		for (int index = 0; index < splitArray.length; index++) {
			String keyValue = splitArray[index];
			//这里重写了拆分逻辑
			String[] keyValuePair = new SequenceSplitor(keyValue).split(MAP_SEPARATOR.charAt(0));
			//注意这个地方注入xworkConverter来进行转换,主要是怕遗漏Map中的键值有可能需要定制转换器,还有一点需要注意,传值使用字符串数组以模拟前台
			Object key = XWorkConverter.getInstance().convertValue(context, null, null, null, new String[] { keyValuePair[0] }, keyClass);
			Object val = XWorkConverter.getInstance().convertValue(context, null, null, null, new String[] { keyValuePair[1] }, valueClass);
			map.put(key, val);
		}

		return map;
	}

	private Map<Object, Object> createMap(Map<?, ?> context, Object target, Member member, String property, Object value, Class<?> toType, int size) {
		Map<Object, Object> map;
		if (toType == ConcurrentMap.class) {
			if (size > 0) {
				map = new ConcurrentHashMap<Object, Object>(size);
			} else {
				map = new ConcurrentHashMap<Object, Object>();
			}
		} else if (toType == SortedMap.class) {
			map = new TreeMap<Object, Object>();
		} else {
			if (size > 0) {
				map = new HashMap<Object, Object>(size);
			} else {
				map = new HashMap<Object, Object>();
			}
		}

		return map;
	}

}

 

分享到:
评论

相关推荐

    三调 八大类 转换 三大类 python

    使用arcgis calculate赋值 选python 直接加载通过三调DLTB中DLBM八大类转换三大类名称

    java项目实体类转换实例

    Java项目实体类转换实例 在Java项目中,实体类转换是指将一个实体类对象转换为另一个实体类对象的过程。在这种情况下,我们可以使用Dozer库来实现实体类转换。Dozer是一个开源的Java类库,用于将一个Java对象转换...

    将现有的C++类转换成dll动态链接库

    ### 将现有的C++类转换成DLL动态链接库 #### 一、DLL的类型与选择 在考虑将现有的C++类转换成DLL时,首先需要理解不同类型的DLL及其适用场景。 1. **Win32DLL** Win32DLL指的是不使用MFC类库创建的DLL。这类DLL...

    行业资料-电子功用-具有E类转换器模块的转换器电路的说明分析.rar

    标题中的“行业资料-电子功用-具有E类转换器模块的转换器电路的说明分析”表明这是一份关于电子工程领域的技术文档,重点是解析含有E类转换器模块的转换器电路。E类转换器是一种高效能的功率转换器,常见于射频(RF...

    C# 转换实体类为Json字符串

    实体类转换成 JSON 字符串,将datatable转换为json,DataTable转换实体类

    c#实体类转换类

    实用的.net实体类转换,在项目中稳定长期的使用,好用分享给大家!

    java类转换为AS3的工具以及一些注意事项

    Java 类转换为 AS3(ActionScript 3)的工具及注意事项 在开发跨平台的应用程序时,有时我们需要将 Java 类转换为 AS3,以便在 Adobe Flash 或 Flex 平台上使用。这种转换通常是为了利用 Java 的强大功能和 AS3 的...

    arcgis脚本工具三调地类转换为三大类

    三调地类转换为三大类

    实体类跟数据传递类转换类TypeCast.java (供参考)

    实体类跟数据传递类转换类TypeCast.java (供参考) 实体类跟数据传递类转换类TypeCast.java (供参考)实体类跟数据传递类转换类TypeCast.java (供参考)

    论文研究 - 与时变系数和协变量比较生存结果的半类转换模型的通用类的仿真研究

    为此,以计数处理方式组织数据并使用将在本文中应用的标准转换类转换时间非常重要。 在系数和协变量的影响随时间变化的情况下,广泛使用的最大似然估计方法在估计一致的估计时变得更加复杂和繁琐。 为了克服这个...

    xml与实体类转换工具

    在Java开发中,将XML数据与Java实体类进行相互转换是非常常见的需求,这有助于简化数据处理和存储。本文将详细介绍如何使用工具类进行XML与实体类的转换,并探讨相关依赖和实现方法。 首先,XML转换为Java实体类的...

    易语言编码类转换模块

    易语言编码类转换模块源码,编码类转换模块,URL编码Utf8,URL编码,URL解码Utf8,URL解码,Ansi转Utf8,Utf8转ansi,Unicode转Utf8,Ansi转Unicode,Unicode转ansi,Utf8转Unicode,MultiByteToWideChar,MultiByteToWideChar1,...

    易语言源码易语言编码类转换模块源码.rar

    易语言源码易语言编码类转换模块源码.rar 易语言源码易语言编码类转换模块源码.rar 易语言源码易语言编码类转换模块源码.rar 易语言源码易语言编码类转换模块源码.rar 易语言源码易语言编码类转换模块源码.rar ...

    图文转换之流程图类转换.ppt

    图文转换之流程图类转换.ppt

    java实体转mysql建表语句

    在Java开发中,将Java实体类转换为MySQL数据库的建表语句是一项常见的任务,它有助于快速构建数据库模型,尤其在使用ORM(对象关系映射)框架如Hibernate、MyBatis时更为便捷。本篇文章将深入探讨这个过程,并提供...

    C#实现实体类与字符串互相转换的方法

    本文实例讲述了C#实现实体类与字符串互相转换的方法。分享给大家供大家参考。具体实现方法如下: using System; using System.Collections.Generic; using System.Text; namespace PackDLL.Data.ConvertData { ///...

    JAVA-JSON工具转换类

    总的来说,`JAVA-JSON工具转换类`这个主题涵盖了JSON数据处理的核心部分,包括JSON的序列化和反序列化,以及数据类型的转换。通过`json-lib`和`ezmorph`这两个库,开发者可以轻松地在Java程序中处理JSON数据,而`...

    babel-plugin-transform-react-class-to-function:Babel 7插件,可将React组件类转换为函数

    Babel 7插件,可将React组件类转换为函数 使用类语法编写React组件有几个好处: 一致性—使用相似的语法定义所有组件。 静态属性-使用静态类属性时,组件更加独立。 比较简单的差异-无需更改在类和函数之间转换...

    Dozer类转换,List实体类型之间的快速转换

    支持Bean类型转换,前提是字段相同。支持List实体之间的类型转换,注意当source不能为null。

    【java】mapstruct自定义类的转换示例(csdn)————程序.pdf

    本示例主要介绍如何在MapStruct中自定义类转换,以便处理特定的转换需求。我们将通过分析标题、描述以及提供的代码片段来深入理解这一过程。 首先,MapStruct通过注解驱动的方式,自动为对象间的转换生成源码,极大...

Global site tag (gtag.js) - Google Analytics