SpringMVC 数据类型转换

最近在做项目时需要将前台 2018-08-06格式的字符串传递到 SpringMVC 的 handler 方法的参数中时,转换成日期对象,想到了 SpringMVC 提供了一个转换器接口可以实现这个需求,特此记录一下:

再次看一下 SpringMVC 的执行流程:

这里写图片描述

在处理数据转换和数据的格式化时一张更加详细的图:

这里写图片描述

注意第四步,适配器在调用我们编写的 handler 方法时,会先经历如下步骤:

  1. 将请求的消息转换成指定类型的对象,比如我们的 MappingJackson2HttpMessageConverter可以将 json 格式的字符串转换成我们指定的实体类对象。
  2. 然后适配器将 ServletRequest 对象 传递给一个 WebDataBindingFactory工厂对象来创建一个上图中的 DataBinder对象来进行数据绑定。
  3. DataBinder对象会调用一个 ConversionServiceFactoryBean工厂 bean 来创建一个 ConversionService对象。
  4. ConversionService对象来对请求中的参数进行数据类型转换数据的格式化
  5. 之后 DataBinder还会再调用 Validator(校验器)进行数据的校验,比如说我们的 Hibernate Validator
  6. 然后 DataBinder会将参数校验的结果封装进一个 BindingResult 对象里面,这就是我们为什么如果要用校验器进行校验的话需要在参数列表上加一个 BindingResult 参数的原因。
  7. 参数的预处理工作结束后,再开始执行我们编写的 handler 方法…

我们现在需要做的就是实现一个 Converter 转换器:

  1. 实现 Converter 接口,注意是 spring 核心包里面的 Converter:

    package com.qjl.pems.converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.springframework.core.convert.converter.Converter;
    
    /**
     * 类描述:负责将欠他传递过来的String类型的日期字符串转换成日期对象
     * 全限定性类名: com.qjl.pems.converter.DateConverter
     * @author 曲健磊
     * @date 2018年8月15日下午9:55:44
     * @version V1.0
     */
    public class DateConverter implements Converter<String, Date> {
    
    	/**
    	 * 将 yyyy-MM-dd 格式的字符串转换成日期对象
    	 */
    	@Override
    	public Date convert(String dateStr) {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    		Date date = null;
    		try {
    			date = sdf.parse(dateStr);
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    		return date;
    	}
    }
    
  2. 在 springMVC 的配置文件中配置一个 ConversionServiceFactoryBean ,并注入我们编写好的 Converter 并在 mvc 注解驱动中指明使用 ConversionService:

    	...
       	<!--开启mvc注解驱动  -->
       	<mvc:annotation-driven conversion-service="conversionService" />
    
       	<!-- 注册自定义的类型转换器 -->
       	<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
       		<property name="converters">
       			<list>
       				<bean class="com.qjl.pems.converter.DateConverter"></bean>
       			</list>
       		</property>
       	</bean>
       	...
    
  3. 看一下 Controller 方法:

    /**
    	 * 处理添加管理员的请求
    	 * @param admin 前台发送的管理员信息
    	 * @return 添加成功与否的提示信息
    	 */
    	@RequestMapping("/insertAdmin")
    	public @ResponseBody Map<String, Object> insertAdmin(Admin admin) {
    		
    		Map<String, Object> resultMap = new HashMap<String, Object>();
    		
    		boolean flag = adminService.insertAdmin(admin);
    		
    		return resultMap;
    	}
    

    Admin 中定义了一个 Date 类型的对象,前台在传送 yyyy-MM-dd 格式的字符串的时候适配器就会去调用我们写好的转换器去自动转换了。
    这里写图片描述

看源码的路径:

  1. 在Controller 方法中打一个断点并以 Debug 模式启动服务。
  2. 在 Debug 窗格下找到 DispatcherServlet.doService,点击。
  3. 在右边找到 handlerAdapters
  4. 在里面找到 WebBindingInitializer
  5. 在里面找到 conversionService,这里面就包含了一系列的转换器,其中就有我们配置好的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值