springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置

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

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

Java代码  

  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类型

怎么注册呢?

Java代码  

  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的属性

Java代码  

  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方法内部

Java代码  

  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

时间: 2024-08-11 16:21:13

springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置的相关文章

springMVC 前后台日期格式传值解决方式之二(共二) @InitBinder的使用

关于springmvc日期问题的解决方式 除了本博客的[springMVC 前后台日期格式传值解决方式之 @DateTimeFormat的使用和配置]一文, 还有如下这种方式: 在Controller里加上这段代码: 1 @InitBinder 2 public void initBinder(ServletRequestDataBinder binder) { 3 /** 4 * 自动转换日期类型的字段格式 5 */ 6 SimpleDateFormat sdf = new SimpleDat

springmvc处理日期格式

解决http400错误 通常有两个来源: 1 页面的下拉列表中传入了字符串,而服务器需要的是Integer类型的,所以服务器拒绝. 2, 浏览器传给服务器端的日期格式字符串,服务器端理解不了,所以需要在entity的日期类型成员变量上加注@DateTimeFormat( pattern = "yyyy-MM-dd" )   服务器->浏览器  封装json  http://jadethao.iteye.com/blog/1741162 浏览器->服务器  转换日期为Date

SpringMVC四种响应传值的方式

1.返回值为void类型 使用方法的参数requesr和response进行数据分享和页面跳转 @RequestMapping("/test1") public void test1(HttpServletRequest request, HttpServletResponse response) throws Exception{ //通过request和response控制页面和共享数据 request.setAttribute("msg","你好,太

Springmvc框架-json数据格式传递过程中-将时间戳转化成标准的日期格式[email&#160;protected]

在上一个小demo中,我们能够看出,其实返回的日期格式也是不对的,现在返回的是一个时间戳,并不是一个标准的日期格式. 解决办法: 第一种:在要转化的实体类中添加@JSONField注解 第二种:配置fastjson的消息转换器,来处理日期格式的问题 springmvc-servlet.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.spring

mysql jdbc处理0日期格式蛋疼问题-也算是BUG

最近在写一个数据库访问的中间平台时,使用MySQL JDBC处理一些日期数据,遇到点变态的问题,给大家乐一乐! 首先来看看什么样的日期数据这么蛋疼呢? DATE            0000-00-00 DATETIME   0000-00-00 00:00:00 TIMESTAMP 0000-00-00 00:00:00 TIME               25:21:22 对于前3种情况,直接用JDBC读取,肯定会报错,报错信息类似这样: Value '0000-00-00' can n

避免浏览器自动填充表单的解决方式

以前在做项目的时候遇到过这个问题,当时年少太轻狂,没有想过是为什么会发生这样的问题,只觉得作为一个用户,每次在登录网站的时候很有用,很便捷,甚至觉得这个自动填充功能,嗯, 真棒!但是,这次又遇到了这个问题,我不禁陷入了沉思...为什么会有自动填充呢?为什么会变成黄色框框呢?作为一个开发者,在我不需要它自动填充的时候,它真的,很碍事! 于是乎~各种谷歌百度,试了一堆方法,终于让我解决了这个问题!!! 首先,在浏览器有点击过记住密码的操作的前提下,在直接写两个input,type分别等于text和p

SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇日期格式报400错误解决方法

系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 使用SpringMVC开发的时候,页面如果有日期格式的数据,后台接受也是java.util.Date,则报告400错误 .下面是解决方案的演示示例: 这个是实体类,里面createDate就是java.util.Date类型 1 import java.util.Date; 2 3 public class User {

SpringMVC 返回json的日期格式的问题的解决方法

springMVC中josn的日期类型输出默认是时间戳,需要进行日期格式转换. 格式化输出json 方法1. 在实体类的getter方法上面添加@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 就可以将json的日期格式化.需要导入的json的相关jar包 @JsonFromat存在于jackson-annotations-2.1.0.jar中. Maven项目需要添加的依赖: <!--

SpringMVC与MyBatis整合之日期格式转换

在上一篇博客<SpringMVC与MyBatis整合(一)——查询人员列表>中遗留了日期格式转换的问题,在这篇记录解决过程. 对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定.         将请求日期数据串传成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致. 在上一篇的示例程序中,Person类属性如下: 而测试结果如下: 所以自定义参数绑定将日期串转成java.util.Date类型.需要向处理器适配器中注入自定义的参数绑定组件. 添加