文档章节

SpringMVC配置全局日期转换器,处理日期转换异常

Zero零_度
 Zero零_度
发布于 2016/03/14 14:53
字数 648
阅读 35
收藏 0
点赞 1
评论 0

spring3.0配置日期转换可以通过配置自定义实现WebBingingInitializer接口的一个日期转换类来实现,方法如下

转换类:

  1. public class DateConverter implements WebBindingInitializer {    

  2.     

  3.     public void initBinder(WebDataBinder binder, WebRequest request) {    

  4.           

  5.         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");    

  6.         binder.registerCustomEditor(Date.classnew CustomDateEditor(df, false));    

  7.     }    

在spring-servlet.xml当中的进行注册:

  1. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">    

  2.     <!-- 日期格式转换 -->    

  3.     <property name="webBindingInitializer">    

  4.         <bean class="DateConverter" />    

  5.     </property>    

  6. </bean>  

 

spring3.1.1的处理进行调整,所以按照3.0的写法在3.1.1里面是无效的,通过查找资料及测试,发现可行方法

原因:

annotation-driven缺省注册类的改变 

Spring 3.0.x中使用了annotation-driven后,缺省使用DefaultAnnotationHandlerMapping 来注册handler method和request的mapping关系。 AnnotationMethodHandlerAdapter来在实际调用handlermethod前对其参数进行处理。 

 

在spring mvc 3.1中,对应变更为 
DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping 
AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter 
AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver 

以上都在使用了annotation-driven后自动注册。 
  而且对应分别提供了AbstractHandlerMethodMapping , AbstractHandlerMethodAdapter和 AbstractHandlerMethodExceptionResolver以便于让用户更方便的实现自定义的实现类。 

 

<mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。

 

spring mvc <mvc:annotation-driven />会自动启动Spring MVC的注解功能,但实际它做了哪些工作呢?

 

Java代码  

  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  

  2. <property name="order" value="1" />  

  3. </bean>  

  4. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  

  5. <property name="webBindingInitializer">  

  6.   <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">  

  7.    <property name="conversionService" ref="conversionService" />  

  8.    <property name="validator" ref="validator" />  

  9.   </bean>  

  10. </property>  

  11. </bean>  

  12. <bean id="conversionService" class="org.springframework.samples.petclinic.util.PetclinicConversionServiceFactory" />  

  13. <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />   


从上面的配置可以看出,我的配置应该是被sping的配置覆盖了,<mvc:annotation-driven />配置中已经包含了webBindingInitializer的配置,看来使用<mvc:annotation-driven />后与原来的配置出现了重复,这种情况下不管<mvc:annotation-driven />放在上面还是放在下面都会出现问题。

 

解决方法:

使用conversion-service来注册自定义的converter 
DataBinder 实现了PropertyEditorRegistry, TypeConverter这两个interface,而在spring mvc实际处理时,返回值都是return binder.convertIfNecessary(见HandlerMethodInvoker中的具体处理逻辑)。因此可以使用customer conversionService来实现自定义的类型转换。 

<mvc:annotation-driven />中配置可以看出,AnnotationMethodHandlerAdapter已经配置了webBindingInitializer,我们可以通过设置其属性conversionService来实现自定义类型转换。

 

Java代码  

  1. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">    

  2.         <property name="converters">    

  3.             <list>    

  4.                 <bean class="com.doje.XXX.web.DateConverter" />    

  5.             </list>    

  6.         </property>    

  7.     </bean>  

 

 需要修改spring service context xml配置文件中的annotation-driven,增加属性conversion-service指向新增的conversionService bean。 

 

Java代码  

  1. <mvc:annotation-driven conversion-service="conversionService" />   

 

 实际自定义的converter如下。 

Java代码  

  1. public class DateConverter implements Converter<String, Date> {    

  2. @Override    

  3. public Date convert(String source) {    

  4.     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");    

  5.     dateFormat.setLenient(false);    

  6.     try {    

  7.         return dateFormat.parse(source);    

  8.     } catch (ParseException e) {    

  9.         e.printStackTrace();    

  10.     }           

  11.     return null;    

  12. }    

 


本文转载自:http://blog.csdn.net/chenleixing/article/details/45156617

共有 人打赏支持
Zero零_度
粉丝 66
博文 734
码字总数 252800
作品 0
程序员
SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意

一、SpringMVC使用@ResponseBody时返回json的日期格式 前提了解: @ResponseBody 返回json字符串的核心类是org.springframework.http.converter.json.MappingJacksonHttpMessageConverter,它......

keppy ⋅ 04/21 ⋅ 0

Spring JMSTemplate 与 JMS 原生API比较

博客分类: JMS Spring 2.x JMSUtil与Spring JmsTemplate的对比 Author:信仰 Date:2012-4-20 未完待续,截止日期2012-4-20 从以下几方面比较JMSUtil和Spring JmsTemplate l 对JNDI的支持 ...

thinkyoung ⋅ 2014/12/12 ⋅ 0

struts2 类型转换

从表单提交的数据全是字符串,在数据到达Action类前会有拦截器先对表单请求进行处理,其中参数拦截器完成表单数的类型转换,但struts2在提供简单的数据转换功能,并不能完全满足实际需求。比...

iborder ⋅ 2016/12/20 ⋅ 0

自定义类型转换器,转换过程中的错误处理

参数封装过程中,数据类型转换问题 1、 struts2 内部提供大量类型转换器,用来完成数据类型转换问题 boolean 和 Boolean char和 Character int 和 Integer long 和 Long float 和 Float doub...

day戴 ⋅ 2014/07/23 ⋅ 0

SpringMVC 中设置日期字符串转换格式

在使用SpringMVC的项目中经常遇到 controller 参数中接收Date类型的数据,但是页面传过来的参数又是日期字符串,会出现转换异常。 由于项目需要支持两种日期格式所以从写了一个日期转换器。网...

大朱 ⋅ 2016/06/17 ⋅ 0

Struts2核心技术 (二)

struts2中的参数封装 静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变。 例子:

architect刘源源 ⋅ 04/24 ⋅ 0

Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串。也就是说服务器接收到的来自用户的数据只能...

长平狐 ⋅ 2012/11/12 ⋅ 0

springmvc学习笔记(22)-springmvc开发小结

springmvc学习笔记(22)-springmvc开发小结 标签: springmvc [TOC] 本文对springmvc系列博文进行小结 springmvc框架 前端控制器:接收request,进行response 处理器映射器:根据url查找Handl...

brianway ⋅ 2016/03/19 ⋅ 2

spring MVC使用及新特性说明

一、 spring MVC使用简述 配置部分: jar包和依赖jar包 前端控制器配置(web.xml): load-on-startup:表示启动容器时初始化该Servlet; url-pattern:表示哪些请求交给Spring Web MVC处理, ...

clark911 ⋅ 2016/08/02 ⋅ 0

Struts2(接受表单参数)请求数据自动封装和数据类型转换

Struts2请求数据自动封装:   (1)实现原理:参数拦截器   (2)方式1:jsp表单数据填充到action中的属性;    普通的成员变量,必须给set,get可以不给的。     注意点,Action中定...

别叫小伙 ⋅ 2017/02/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

中标麒麟(龙芯版)7.0优盘安装

########################################## 制作U盘安装盘: 1.准备U盘: PMON环境下U盘必须格式化成ext3; 昆仑固件环境下可以格式化成ext3,ext4 2.把整个镜像 xxx.iso 复制到U盘下面 3....

gugudu ⋅ 17分钟前 ⋅ 0

老司机写的大数据建模五步走

本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。 01 第一步:选择模型或自定义模式 这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。 比如,如果要预...

gulf ⋅ 26分钟前 ⋅ 0

PacificA 一致性协议解读

PacificA 的 paper 在 08 年左右发出来的,比 Raft 早了 6,7 年。 在 PacificA 论文中,他们强调该算法使用范围是 LAN (Local Area Network),讲白了就是对跨机房不友好。 不管是 ZAB,Raf...

黑客画家 ⋅ 28分钟前 ⋅ 0

盘符图标个性化

设置自己的专属盘符图标 准备ico格式的图片文件一个,在根目录下创建autorun.inf文件 文件内容 [Autorun]icon=logo.ico 重新启动或者插拔U盘即可看到结果...

阿豪boy ⋅ 28分钟前 ⋅ 0

Windows下QQ聊天记录中图片的默认存放位置

Windows下QQ聊天记录中图片的默认存放位置在设置中是没有说明的。 实测位置在:D:\Documents\Tencent Files\974101467\Image 其中: “974101467”为对应的QQ号; “C2C”为个人之间的聊天图...

临江仙卜算子 ⋅ 35分钟前 ⋅ 0

GC 的三种基本实现方式

参考资料《代码的未来》(作者: [日] 松本行弘)。 由于并非本人原著(我只是个“搬运工“),SO 未经本人允许请尽情转载。 另外个人像说明一下这里所说的GC指泛指垃圾回收机制,而单指Jav...

xixingzhe ⋅ 36分钟前 ⋅ 0

Android双击退出

/** * 菜单、返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode......

王先森oO ⋅ 40分钟前 ⋅ 0

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 45分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 49分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 52分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部