无意中发现对于时间字符串转Date类,根本不用自己去写转换类,spring mvc已经实现了该功能,还是基于注解的,轻松省事,使用 org.springframework.format.support.FormattingConversionServiceFactoryBean
之后,只要在vo里加注解就行了

使用时要引入一个类库joda-time-n.n.jar

  1. @DateTimeFormat(pattern="yyyy-MM-dd")
  2. private Date dateRangeStart;// 通行日期范围开始

@DateTimeFormat(pattern="yyyy-MM-dd") 可将形如1980-0-01的字符串转换到Date类

@NumberFormat(pattern="#,###.##") 可将形如4,500.00的字符串转换成long类型

怎么注册呢?

  1. <bean id="conversionService"
  2. class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
  3. <mvc:annotation-driven validator="validator"
  4. conversion-service="conversionService" />

使用<mvc:annotation-driven /> 的话,默认就启用FormattingConversionServiceFactoryBean了,所以上面的配置也省了。

但是<mvc:annotation-driven />基本不用,因为总得做些个性化设置,那怎么注册FormattingConversionServiceFactoryBean给spring mvc呢?

起初我以为得从DefaultAnnotationHandlerMapping入手,后来通过看<mvc:annotation-
driven
/>的解析器AnnotationDrivenBeanDefinitionParser源码,才发现原来是
AnnotationMethodHandlerAdapter的属性

  1. RuntimeBeanReference conversionService = getConversionService(element, source, parserContext);
  2. RuntimeBeanReference validator = getValidator(element, source, parserContext);
  3. RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class);
  4. bindingDef.setSource(source);
  5. bindingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
  6. bindingDef.getPropertyValues().add("conversionService", conversionService);
  7. bindingDef.getPropertyValues().add("validator", validator);
  8. RootBeanDefinition annAdapterDef = new RootBeanDefinition(AnnotationMethodHandlerAdapter.class);
  9. annAdapterDef.setSource(source);
  10. annAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
  11. annAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef);
  12. annAdapterDef.getPropertyValues().add("messageConverters", getMessageConverters(source));

getConversionService方法内部

  1. if (element.hasAttribute("conversion-service")) {
  2. return new RuntimeBeanReference(element.getAttribute("conversion-service"));
  3. }
  4. else {
  5. RootBeanDefinition conversionDef = new RootBeanDefinition(FormattingConversionServiceFactoryBean.class);
  6. conversionDef.setSource(source);
  7. conversionDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
  8. String conversionName = parserContext.getReaderContext().registerWithGeneratedName(conversionDef);
  9. parserContext.registerComponent(new BeanComponentDefinition(conversionDef, conversionName));
  10. return new RuntimeBeanReference(conversionName);
  11. }

原来<mvc:annotation-driven />是这么注册FormattingConversionServiceFactoryBean的

如果不使用<mvc:annotation-driven />标签的话,只要配置AnnotationMethodHandlerAdapter的属性就可以了

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<!-- 支持@DateTimeFormat(pattern="yyyy-MM-dd")等注解 2015年7月31日11:07:03 liuyx-->
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService">
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
</property>
</bean>
</property>
</bean>

原文:http://relive123-yahoo-com-cn.iteye.com/blog/1678376

最新文章

  1. 【BZOJ-3696】化合物 树形DP + 母函数(什么鬼)
  2. Altium Designer 15 --- PCB 3D View
  3. BuildingAssetBundles in 5.x
  4. WP8_GestureListener实现列表向下滑动加载新数据
  5. [Effective C++ --022]将成员变量声明为private
  6. PHP &#39;ext/gd/gd.c&#39;信息泄漏漏洞
  7. Executing System commands in Java---ref
  8. 系统架构、网络通信、IM、视频会议技术
  9. MVC从视图传参到Controller几种方式
  10. DPDK l2fwd 浅注
  11. mac 画图
  12. 常见MD5加密解密值及免费解密网站
  13. [Swift]LeetCode62. 不同路径 | Unique Paths
  14. 【代码笔记】Web-JavaScript-JavaScript字符串
  15. Python 19 Django 详解
  16. lua keynote2
  17. tmp下莫名其妙生成root权限的缓存文件
  18. Aop实现拦截方法参数
  19. 机器学习之数据预处理,Pandas读取excel数据
  20. 关于C/C++中main函数参数的学习

热门文章

  1. Linux内核情景分析的alloc_pages
  2. 使用timeit模块 测试两种方式生成列表的所用的时间
  3. 开始gentoo之旅
  4. .net 实用功能
  5. (7)java基础知识-原码、反码、补码、运算符
  6. manacher(马拉车)算法详解+例题一道【bzoj3790】【神奇项链】
  7. 3.1常用类(java学习笔记)包装类及日期类
  8. 面向对象-QuickHit项目
  9. Mycat查询时出现:Error Code: 1064. can&#39;t find any valid datanode
  10. win7 下注册dll文件失败