文档章节

小谈 FastConverter

wanxiangming
 wanxiangming
发布于 06/05 12:14
字数 1195
阅读 16
收藏 2

前情

几个月前我为公司写一个用于实现RESTful API的项目基础框架,它是一个位于spring cloud项目中的open service内的基础框架,用来统一处理请求和返回。其中,为了实现数据的转换,我开发了一个小工具,叫做“FastConverter”。最初它被用来将数据实体转换为json string,在转换的过程中,使用注解的方式来定义数据转换逻辑。

后来在完成其他一些公司任务的过程中,我发现,这个FastConverter比我预期的还好用。它成功的将那些修饰数据形式的代码从业务逻辑代码中分离了出去。我不用在开发过程中去关心数据最后要呈现的样子,它们会被注解安全的修饰,并优雅的解决。

FastConvert好用的原因:BeanToMapConverterHandler

完整的FastConvert原理在我的另一篇博客《记一个小小的转换工具的开发:FastConverter》中。

public class CommonConverterFilter extends AbstractConverterFilter {
	[@Override](https://my.oschina.net/u/1162528)
	protected void initConverters(List<Converter<?, ?>> converters) {
		converters.add(new StringConverterHandler());
		converters.add(new NumberToStringConverterHandler());
		converters.add(new BooleanToStringConverterHandler());
		converters.add(new DateToTimeStampStringConverterHandler());
		converters.add(new NullConverterHandler());

		converters.add(new MapToMapConverterHandler<>(this));
		converters.add(new ArrayToListConverterHandler<>(this));
		converters.add(new CollectionToListConverterHandler<>(this));
		converters.add(new BeanToMapConverterHandler(this));
	}
}

在fastconverter中,有转换器过滤器(ConverterFilter)这一概念,你可以编写一个依赖于ConverterFilter的转换器,ConverterFilter能够为你提供一些默认数据的转换逻辑。比如上面代码所示的ConverterFilter。它是FastConverter提供的通用ConverterFilter,该ConverterFilter提供了对String,Number(包括int,long,double,float,BigDecimal),布尔值,日期,空,Map,数组,Collection,以及java Bean的默认转换方式的支持。当然你可以去实现你自己的ConverterFilter。

其中,BeanToMapConverterHandler的实现是对ConverterFilter使用的最好示例,同时BeanToMapConverterHandler成为了FastConverter好用的关键。简单来说,BeanToMapConverterHandler使用ConverterFilter提供的默认转换器来执行默认转换,而你,可以通过在Bean的域上配置@FieldConverter注解来指定特定的转换器对数据进行转换。

我的某些Bean长这个样

public class LoanApplyInfoFileUploadEntity implements BaseEntity {

	private String name;

	@Field(name = "pid")
	private String idCard;

	@FieldConverter(converter = LoanPurposeConverter.class)
	private String loanPurpose;

	@FieldConverter(converter = DateToFormatStringConverterHandler.class, tip = "yyyy-MM-dd'T'HH:mm:ss")
	private Date uploadTs;
	
	@FieldConverter(converter = DateToFormatStringConverterHandler.class, tip = "yyyy-MM-dd")
	private Date dueDate;
	
	@FieldConverter(converter = DateListToStringConverter.class, tip = "yyyy-MM-dd")
	private List<Date> targetRepayDateList;
	
	... 省略getter,setter

我只需要使用数据的原始java类型来组装bean,组装时也不用关心数据将来需要变成什么样子,无论数据将来会变成什么样,都有与逻辑分离的转换器可以一键解决(当然,你可以不使用BeanToMapConverterHandler,你可以编写适用于自己的BeanToXXXConverterHandler,或者其他任何ConverterHandler)。

小悟

关注点分离真的是编程工作中最得力的一把利器,是写出优雅代码的关键。记得《java编程思想》的“并发”一章,在聊到并发的作用时,举了一个事件驱动的例子。

实际上,使用并发最吸引人的一个原因就是要产生具有可响应的用户界面。考虑这样一个程序,它因为将执行某些长期运行的操作,所以最终用户输入会被忽略,从而成为不可响应的程序。如果有一个‘退出’按钮,那么你肯定不想在你写的每一段代码中都检查它的状态。因为这会产生非常尴尬的代码,而我们也无法保证程序员不会忘记检查。如果不使用并发,则产生可响应用户界面的唯一方式就是所有的任务都周期性地检查用户输入。

这虽是一个对并发能力的场景描述,但它也让我想到了关注点分离,写一个专门的并发程序去监听按钮的状态,就是一种关注点分离。虽然关注点分离是如此的重要和常见,但不得不说,我还是见到了许多“在每一段代码中都检查它的状态”的代码。实际上,代码上出现这种问题,还不是最可怕的,最可怕的是项目架构上出现这种问题,我相信有很多程序员在遭受这种架构的折磨。

如果你在开发的过程中遇到了数据转换方面的需求,不妨来试一试FastConverter吧,如果你有好的想法,欢迎交流,欢迎PR,它在这里(FastConverter的Github地址)

© 著作权归作者所有

wanxiangming
粉丝 3
博文 24
码字总数 38833
作品 0
东城
私信 提问
SpringBoot 配置FastJson

SpringBoot 配置FastJson , Google百度一下一大堆 , 我就贴一下我的方式: extends org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter Override configureMessage......

ol_O_O_lo
2018/12/18
23
0
在springboot中添加jsonConverter

spring默认支持的是jackson2的json解析器.现在大部分人都习惯了fastJson的解析器.现在简单的说下如何配置json解析器 jackson2 配置如下: 可以使用@JsonFormat(shape = JsonFormat.Shape.STRI...

流光韶逝
2018/02/02
527
0
使用 dumpdecrypted 砸壳时出现 Killed:9 的问题

这样一般是由于 没有进行签名导致的,我们需要对它进行签名,下面是签名的方法 查看本地可用的证书 这里可以查看 Mac 上已经安装的开发者证书 dylib 签名 成功以后,这个 就已经是签名后的东...

SSBun
2018/07/25
0
0
WebMvcConfigurerAdapter详解

SpringBoot——》WebMvcConfigurerAdapter详解 一、WebMvcConfigurerAdapter是什么 二、WebMvcConfigurerAdapter常用的方法 1、addInterceptors:拦截器 2、addCorsMappings:跨域 3、addVi......

fly祥
03/12
108
0
Scrapy小谈

有补充的可以联系我 如果有更好的技巧或者是一些心得也可以分享给我~ Author: Leo Wechat: Leo-sunhailin E-mail: 379978424@qq.com 会一直维护下去,待补充... 直入主题...

NullSpider
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
27分钟前
9
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
7
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
19
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
今天
68
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部