Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中:

Converter<S,T>:将 S 类型对象转为 T 类型对象;

ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类;

GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。

举个例子来实现下自定义转换器:

例如Employee对象,现在在页面提交的时候内容是“zhangsan,aaa@qq.com,1,101”,需要转化为Employee对象进行保存。

首先先看Employee对象:

public class Employee {
private Integer id;
private String lastName;
private String email;
private Integer gender;
private Date birth;
private Department department;
}

“zhangsan”赋给lastName;

“aaa@qq.com”赋给email;

“1”给gender;

“101”给Department ;

再看下Department的结构:

public class Department {

    private Integer id;
private String departmentName;
}

上面的JavaBean省略了构造和get set细节,具体代码里面应该写上,博客里面就不累赘。

然后自定义转换器:

import org.springframework.core.convert.converter.Converter;

import com.soyoungboy.bean.Department;
import com.soyoungboy.bean.Employee;
/**
* string转Employee
* @author MSI1
*
*/
public class StringToEmployeeConverter implements Converter<String, Employee> { @Override
public Employee convert(String str) {
String strTrim = str.trim();
if (strTrim != null && !strTrim.equals("")) {
String[] strs = strTrim.split(",");
// zhangsan,aaa@qq.com,1,101,将字符串转化为字符串数组,然后通过构造函数拼装进指定属性
Employee employee = new Employee(null, strs[0], strs[1], Integer.parseInt(strs[2]),
new Department(Integer.parseInt(strs[3]), ""));
return employee;
}
return new Employee();
} }

配置文件里面配置:

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<bean class="com.atguigu.StringToEmployeeConverter"></bean>
</property>
</bean>

将自定义的转换器注册到Spring上下文中去。

jsp界面:

 <form action="${ctp }/quickadd" method="post">

        <!-- 员工的所有信息全部写上;用-分隔

        zhangsan-aaa@qq.com-1-101

          -->

        员工信息:<input name="empInfo" value="zhangsan,aaa@qq.com,1,101" style="width: 300px;"/>

        <input type="submit" value="快速添加"/>

    </form>

测试代码:

@RequestMapping("/quickadd")
public String quickAdd(@RequestParam("empInfo")Employee emp){
System.out.println(emp);
employeeDao.save(emp);
return "redirect:/emps";
}

Spring -- 自定义转换器的更多相关文章

  1. spring mvc 自定义转换器

    <!-- 注册转化器 --> <mvc:annotation-driven conversion-service="conversionService" /> ...

  2. spring自定义schema学习

    [转载请注明作者和原文链接,欢迎讨论,相互学习.] 一.前言 1. 最近在学习dubbo,里边很多如provider.consumer.registry的配置都是通过spring自定义Schema来实 ...

  3. Struts2 请求数据的自动封装 及 自定义转换器类

    请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...

  4. Flask自定义转换器,实现路由匹配正则表达式参数

    Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...

  5. Spring自定义类扫描器 ClassPathScanningCandidateComponentProvider

    项目中有个需求 读取xml文件,然后 对xml文件进行解析,比如如果是 Gender=0/1的话,分别代表男女. 所以需要在构造函数之后,初始化bean之前进行过滤解析 xml文件: <inte ...

  6. struts2自定义转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

  7. flask自定义转换器

    根据具体的需求,有些时候是需要用到正则来灵活匹配URL,但是Flask的路由匹配机制是不能直接在路由里直接写正则的,这时候就需要使用转换器! Flask的默认转换器: DEFAULT_CONVERTE ...

  8. spring 自定义标签的实现

    在我们进行Spring 框架开发中,估计用到最多的就是bean 标签吧,其实在Spring中像<mvc/><context/>这类标签以及在dubbo配置的标签都是属于自定义的 ...

  9. Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器

    时间关系,本文就 Retrofit 2.0的简单使用 做讲解  至于原理以后有空再去分析 项目全面.简单.易懂  地址: 关于Retrofit 2.0的简单使用如下:  https://gitee.c ...

随机推荐

  1. vue-router路由懒加载(解决vue项目首次加载慢)

    懒加载:----------------------------------------------------? 也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载? 像vue这种单 ...

  2. 安装MongoDB(做成Windows服务)并加载C#驱动程序

    一 Mongodb简介: 通过查询网上的一些信息来介绍一下Mongodb的优势:MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL.在使用Mo ...

  3. mvn clean compile package install deploy

    (1) package 目的是打包,在pom中,如果是jar就会打包成jar,如果是war就会打包成war 在pom.xml中: <modelVersion></modelVersi ...

  4. 集合之LinkedList(含JDK1.8源码分析)

    一.前言 LinkedList是基于链表实现的,所以先讲解一下什么是链表.链表原先是C/C++的概念,是一种线性的存储结构,意思是将要存储的数据存在一个存储单元里面,这个存储单元里面除了存放有待存储的 ...

  5. python之if使用方法举例

    if使用方法举例: import random #随机生成1-100的整数 n = random.randint(1, 100) if n > 50: print(n, "> 5 ...

  6. 三、K8S成功

    kubeadm join 172.17.149.114:6443 --token yjogpa.kk85u2i4n5rt1omq --discovery-token-ca-cert-hash sha2 ...

  7. vue 子组件修改父组件传来的props值,报错

    vue不推荐直接在子组件中修改父组件传来的props的值,会报错 [Vue warn]: Avoid mutating a prop directly since the value will be ...

  8. Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  9. java数据库导入excel数据

    导入数据会将表格分为xls和xlsx两种格式,网上有很多案例 1.excel数据表中的数据不全,数据库中又是必填选项:---从sql语句入手:判断有无 来改变语句 //设置可有可无 字段 加一个必有字 ...

  10. Civil 3D CustomDraw .NET混合项目设置

    样例文件中的CustomDraw项目使用的是COM API,但COM API不完整,某些时候需要使用.NET API,此时需要将C++项目设置成"公共语言运行时支持(/clr)"但 ...