spring有2种类型转换器,一种是propertyEditor,一种是Converter.虽然都是类型转换,但是还是有细微差别.

所以这里以一个例子的形式来分析一下这2种类型转换的使用场景和差别.

平常的应用中应该有很多这样的情况,一个po中有一个字段是status,这个status=0时代表成功,status=1时代表失败...虽然这个status可以定义为Integer的类型,但是有时候可能为了方便管理和更面向对象,直接定义了一个TypeStatus的类来表示这个status字段.这个TypeStatus的实现可能如下,当然这只是个demo不要当真:

public class TypeStatus {

    private Integer value;
private String msg; public TypeStatus(Integer value, String msg) {
this.value = value;
this.msg = msg;
}
public static TypeStatus toBean(Integer value){
if(value==0){
return new TypeStatus(0,"成功");
}else if(value==1){
return new TypeStatus(1,"失败");
}else{
return null;
}
}
public Integer getValue() {
return value;
}
public String getMsg() {
return msg;
}
}

然后问题来了,虽然这样封装了一下后那个status字段变得更生动了..但是我们从前端页面中传过来一个0,到controller中spring如何把0转成一个TypeStatus类型呢?假设含有这个status字段的po如下:

public class PoDemo {
TypeStatus status;
}

controller如下:

public class DemoController {

    public String testEditor(PoDemo po){
return "ok";
} }

从一种类型到另一个类型,这肯定需要用到类型转换,我们先看第一种propertyEditor的实现,在controller中增加如下方法:

    @InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(TypeStatus.class, "status", new TypeStatusEditor());
}

方法registerCustomEditor的第二个参数为字段名,标识字段名为status,类型为TypeStatus的属性将会应用此类型转换,如果我们的PoDemo有另一个字段statusToo也为TypeStatus类型,那么将不会应用此类型转换.如果想把所有的TypeStatus类型字段都应用此类型转换,则第二个参数可以设置为null.

TypeStatusEditor的实现如下:

public class TypeStatusEditor extends PropertyEditorSupport {

    @Override
public String getAsText() {
TypeStatus ts = (TypeStatus) getValue();
return String.valueOf(ts.getValue());
} @Override
public void setAsText(String text) throws IllegalArgumentException {
TypeStatus ts = TypeStatus.toBean(Integer.parseInt(text));
setValue(ts);
} }

PropertyEditor的使用此处不做讨论.从代码中也大体能看出实际是一个String到类型的过程,这个恰恰是propertyEditor和Converter的一个区别所在.PropertyEditor主要应用场景为String到类型的转换.从Editor提供的get和set方法也可以看出,必经过String.一般前台页面传过来的值大多是String类型,此时用PropertyEditor来转换再合适不过了.
ProertyEditor是String到类型,这只是一种特殊情况的转换,而说到最通用的肯定是类型到类型.此时就是Converter的应用了.
还是PoDemo和Controller:

public class PoDemo {
byte[] img;
}
public class DemoController {

    public String testEditor(PoDemo po){
return "ok";
} }

比如我们向数据库中存一个图片,那么数据库中是以blob类型存储的,而java类中对应的类型实际是byte[],那么问题又来了,我前台上传一张图片实际上以MultipartFile类型传到Controller中的,spring如何将MultipartFile转换成byte[]自动封装成PoDemo类呢?此时PropertyEditor显然不行了.这已经是类型到类型转换,只能用Converter.

实现如下:

public class MultipartFileToByteArrayEditor implements  Converter<CommonsMultipartFile,byte[]> {

    @Override
public byte[] convert(CommonsMultipartFile source) {
return source.getBytes();
} }

然后我们还需要在spring的配置文件中注册一下:

<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="xx.xx.MultipartFileToByteArrayEditor"/>
</list>
</property>
</bean>

这里使用的系统提供的FormattingConversionServiceFactoryBean来注册我们的类型转换器类MultipartFileToByteArrayEditor,实际也可以用ConversionServiceFactoryBean来注册.

都配置好后,spring就可以自动将MultipartFile转换成byte[]并封装成PoDemo了.

可能有人想到Converter实际上是包含PropertyEditor的,那么如果2种转换器都适用,那么究竟会适用哪种呢?Spring默认是首先查找PropertyEditor,然后再查找Converter.

总结:PropertyEditor适用于String到类型,而Converter更加通用用于类型到类型.PropertyEditor优先级更高.

 

spring类型自动转换——@InitBinder和Converter的更多相关文章

  1. JavaScript的类型自动转换高级玩法JSFuck

    0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!( ...

  2. tp类型自动转换和自动完成

    一.类型自动转换 在模型中对数据库字段自动完成 //模型中数据类型自动转换 添加一个$type数组即可protected $type=array( 'username'=>'serialize' ...

  3. 类型转换构造函数 及使用explicit避免类型自动转换------新标准c++程序设计

    类型转换构造函数:  除复制构造函数外,只有一个参数的构造函数一般可以称作类型转换构造函数,因为这样的构造函数能起到类型自动转换的作用.例如下面的程序: #include<iostream> ...

  4. 3_PHP表达式_5_数据类型转换_类型自动转换

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 1.布尔型数据参与算数运算时,TRUE被转换为整数1,FALSE被 ...

  5. struts2(二) 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  6. struts2(三)之表单参数自动封装与参数类型自动转换

    前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...

  7. struts2各个功能详解(1)----参数自动封装和类型自动转换

    struts2里面的各个功能,现在确实都不清楚,完全属于新学! 通过前面的例子,有时就会疑问,这些jsp中的数据信息是怎么传送给action的?例如: <form action = " ...

  8. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  9. JavaScript的类型自动转换样例集合处

    1.前言 如果Javascript期望使用一个字符串,它会把给定的值转换成字符串:如果Javascript期望使用一个数字,它会把给定的值转化成数字. 2.样例 2.1.字符串拼接时有数字 windo ...

随机推荐

  1. react基础(1)

    在 react入门系列 里面,介绍了一些react的基础知识,在react基础部分,会结合手脚架工具进行更多的总结. 关于webpack我在这里就不讲解了,有需要的小伙伴可以自己去百度一下学习资料,我 ...

  2. MacOS使用AMPPS环境

      下载(http://www.ampps.com/download)并安装AMPPS 基本配置:2.1选中所有扩展2.2 变更PHP版本为5.3 配置虚拟主机(Virtual Hosts) AMPP ...

  3. WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】

    WCF Interview Questions – Part 4   This WCF service tutorial is part-4 in series of WCF Interview Qu ...

  4. QTableWidget详解(样式、右键菜单、表头塌陷、多选等)

    在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件,网上的资料不少,但是都是最基本的,有一些比较经常遇到的问题也说得不太清楚.所以,今天就在这里总结一下! 以下为个人模拟Windo ...

  5. jQuery带控制按钮向上和向下滚动文本列表

    效果:http://hovertree.com/texiao/jquery/64/ 效果图如下: 代码如下: <!DOCTYPE html> <html> <head&g ...

  6. IIS 配置Http重定向到Https

    注意首先要安装url重定向模块    https://www.microsoft.com/zh-CN/download/details.aspx?id=7435 然后在web.config末尾添加如下 ...

  7. thinkphp怎么设置输入网址直接进入首页

    1.设置apache服务器的时候,文件的位置要写包含index.php的那个主文件夹. 2.apache和thinkphp默认index.html是作为网站的默认首页,所以在浏览器端可以直接输入网址进 ...

  8. java web学习总结(十四) -------------------JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  9. js事件处理、事件对象

    事件类型分类: 1 添加在html结构中的事件 <div id="div1" onclick="alert('append click event in html' ...

  10. java语言中除数为零问题

    在以下几个例子中,输出结果如何? float aa=0; System.out.println(aa/0); System.out.println(1/aa); System.out.println( ...