`

彻底解决springMVC无法接受日期类型参数

阅读更多

一、问题

springMVC有一个不叫奇葩的问题,就是如果接受参数是日期(java.util.Date)类型或者参数是包含了(java.util.Date)得POJO将会导致无法进入Controller的方法。没想明白为什么spring作为那么成熟的框架没有兼容这个问题。好了,不废话了,下面讲一下解决办法(不一定是最佳方案,仅供参考)

 

二、解决办法

1、网上解决办法

其实spring提供了一种解决办法(也是网上查到比价普遍的做法),就是在每一个Controller类里面增加如下方法:

    @InitBinder    

    protected void initBinder(WebDataBinder binder) {    

        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat(""), true));    

 

    }   

这种方法的缺陷:一个比较大的项目的话,可能需要有带时间的日期,也有可能是不带日期的日期,这种办法只能兼用一种日期格式数据

 

2、我的解决办法

基于上述方法,我查看了spring 这个CustomDateEditor类的源码,其实这个类是提供了日期转换功能。所以我的做法是

第一步:

写一个自己的CustomDateEditor类,让这个类拥有更加强大的日期转换支持,具体代码如下:

import java.beans.PropertyEditorSupport;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.regex.Pattern;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.util.StringUtils;

 

import com.tl.core.exception.FrameworkException;

 

/**

 * 重写spring日期转换器,自定义日期转换器

 * @author zeliangmo

 * mzl 2016-10-7

 */

public class MyCustomDateEditor extends PropertyEditorSupport {

 

protected Logger logger = LoggerFactory.getLogger(this.getClass());

 

 

/**

* Parse the Date from the given text, using the specified DateFormat.

*/

@Override

public void setAsText(String text) throws IllegalArgumentException {

if (!StringUtils.hasText(text)) {

// Treat empty String as null value.

setValue(null);

}

else {

try {

setValue(this.dateAdapter(text));

}

catch (FrameworkException ex) {

ex.printStackTrace();

logger.error("出错日志:"+ex.getMessage());

}

}

}

 

/**

* Format the Date as String, using the specified DateFormat.

*/

@Override

public String getAsText() {

Date value = (Date) getValue();

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

return (value != null ? dateFormat.format(value) : "");

}

 

/**

     * 字符串转日期适配方法

     * @param dateStr 日期字符串

     * @throws FrameworkException 

     */

    public static Date dateAdapter(String dateStr) throws FrameworkException {

    Date date=null;

    String temp=dateStr;//缓存原始数据

    if(!(null==dateStr||"".equals(dateStr))){

    

    //判断是不是日期字符串,如Wed May 28 08:00:00 CST 2014

    if(dateStr.contains("CST")){

    date=new Date(dateStr);

    }else{

    dateStr=dateStr.replace("年", "-").replace("月", "-").replace("日", "").replaceAll("/", "-").replaceAll("\\.", "-").trim();

        String fm="";

        

        //确定日期格式

        if(Pattern.compile("^[0-9]{4}-[0-9]{2}-[0-9]{2}.*").matcher(dateStr).matches()){

        fm = "yyyy-MM-dd";

        }elseif(Pattern.compile("^[0-9]{4}-[0-9]{1}-[0-9]+.*||^[0-9]{4}-[0-9]+-[0-9]{1}.*").matcher(dateStr).matches()){

        fm = "yyyy-M-d";

        }else if(Pattern.compile("^[0-9]{2}-[0-9]{2}-[0-9]{2}.*").matcher(dateStr).matches()){

        fm = "yy-MM-dd";

        }elseif(Pattern.compile("^[0-9]{2}-[0-9]{1}-[0-9]+.*||^[0-9]{2}-[0-9]+-[0-9]{1}.*").matcher(dateStr).matches()){

        fm = "yy-M-d";

        }

        

        //确定时间格式

        if(Pattern.compile(".*[ ][0-9]{2}").matcher(dateStr).matches()){

        fm+= " HH";

        }else if(Pattern.compile(".*[ ][0-9]{2}:[0-9]{2}").matcher(dateStr).matches()){

        fm+= " HH:mm";

        }else if(Pattern.compile(".*[ ][0-9]{2}:[0-9]{2}:[0-9]{2}").matcher(dateStr).matches()){

        fm+= " HH:mm:ss";

        }else if(Pattern.compile(".*[ ][0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{0,3}").matcher(dateStr).matches()){

        fm+= " HH:mm:ss:sss";

        }

        

        if(!"".equals(fm)){

        try {

date = new SimpleDateFormat(fm).parse(dateStr);

} catch (ParseException e) {

throw new  FrameworkException("参数字符串“"+dateStr+"”无法被转换为日期格式!");

}

        }

    }

    

    }

    return date;

    }

    

 

 

}

 

第二步:写一个基础Controller,然后全部Controller都继承这个基础Controller就可以解决问题,代码如下:

import java.util.Date;

 

import org.springframework.web.bind.WebDataBinder;

import org.springframework.web.bind.annotation.InitBinder;

 

import com.tl.core.spring.MyCustomDateEditor;

 

/**

 * 所有controller的父类

 */

public class BaseController {

 

 

@InitBinder    

public void initBinder(WebDataBinder binder) {    

    binder.registerCustomEditor(Date.class, new MyCustomDateEditor());    

}  

 

 

}

分享到:
评论

相关推荐

    SpringMVC接收请求参数所有方式总结

    14. 处理日期类型参数: - 统一以字符串形式接收,然后手动转换。 - 使用`@DateTimeFormat`或`@JsonFormat`注解指定日期格式。 - 自定义Jackson序列化和反序列化规则。 - 最佳实践是定义全局日期格式,或使用`...

    解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    在SpringMVC框架中,日期类型的参数转换是常见的问题之一。当我们在实体类中使用java.util.Date类型的属性时,可能会出现类型转换错误的问题。在本文中,我们将探讨解决SpringMVC关于前台日期作为实体类对象参数类型...

    springmvc接收参数为日期类型

    本文将深入探讨如何在Spring MVC中接收日期类型的参数,以及遇到问题时如何解决。首先,我们需要理解Spring MVC处理请求参数的基本原理,然后了解日期类型的特殊性,最后会提供具体的解决方案。 一、Spring MVC请求...

    springMVC解决中文乱码

    SpringMVC解决中文乱码问题 SpringMVC 框架中,中文乱码问题是常见的问题之一。解决这个问题的关键是正确地配置字符编码。下面我们将详细介绍 SpringMVC 中解决中文乱码问题的思路和方法。 配置文件中的字符编码 ...

    SpringMVC数据类型转换超详细介绍

    1. **转换范围有限**:`PropertyEditor`仅能处理字符串到对象的转换,无法满足复杂的数据类型转换需求,例如常见的长整型时间戳到日期类型(`Long`到`Date`)的转换。 2. **线程安全性问题**:由于`PropertyEditor`是...

    解决SpringMVC接收不到ajaxPOST参数的问题

    "解决SpringMVC接收不到ajaxPOST参数的问题" SpringMVC是一款流行的Java Web框架,它提供了强大的MVC架构和灵活的配置机制。但是,在使用SpringMVC时,经常会遇到ajax POST请求参数接收不到的问题。本文将探讨解决...

    SpringMVC PPT_springmvc_

    SpringMVC 是一款基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。本教程将深入探讨 SpringMVC 的核心概念、配置以及实际应用。...

    解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题

    解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题 SpringMVC 是一个基于模型-视图-控制器(MVC)模式的Web应用程序框架,广泛应用于Java Web开发中。但是,在使用SpringMVC时,常见的一个问题是...

    SpringMVC讲解文档

    * 例如,定义一个将请求的日期数据串转换为 Java 中的日期类型的 Converter ConversionService * 提供了一种机制来将请求的参数转换为 Java 对象 * 可以通过注入 ConversionService 来实现自定义参数绑定

    ssm-springMVC-整合Quartz(解决了无法注入service问题).doc

    ssm-springMVC-整合Quartz(解决了无法注入service问题).doc

    springmvc基础.docx

    springmvc基础 包含代码+知识点+详细解释 1. 什么是springmvc? 2. springmvc框架原理 前端控制器、处理器映射器、处理器适配器... 参数绑定(简单类型、pojo、集合类型) 自定义参数绑定 6. springmvc和struts2区别

    SpringMVC参数绑定

    对于特殊数据类型,如日期类型,如果前端发送的日期格式与SpringMVC默认支持的格式不符,可以采用两种方式解决:一是前端调整日期格式为SpringMVC支持的格式,例如从"yyyy-MM-dd"改为"yyyy/MM/dd";二是后端在对应的...

    springmvc接收ajax请求注意事项

    在 Ajax 请求中,如果传输的参数是基本数据类型,例如数字、字符串等,那么需要将 `contentType` 属性设置为 `application/json`。例如: ```javascript $.ajax({ url: "${pageContext.request.contextPath}/...

    SpringMVC返回值类型.rar

    SpringMVC返回值类型

    java springmvc

    **SpringMVC详解** SpringMVC是Spring框架的一部分,它是一个模型-视图-控制器(MVC)架构的实现,用于构建Web应用程序。SpringMVC通过解耦控制器、业务逻辑和服务层,使得开发者可以更专注于应用程序的核心功能。...

    SpringMVC 传日期参数到后台的实例讲解

    在 SpringMVC 中,有两种方式可以实现日期参数的传递,一种是使用注解的方式,另一种是使用类型转换的方式。 使用注解的方式 在使用注解的方式中,我们需要在 Controller 层中使用 `@InitBinder` 注解来实现日期...

    springMVC学习

    本指南提供了 SpringMVC 的核心思想、框架特点、入门示例、参数传递、标签介绍、拦截器、类型转换、JSON 格式数据的输入和输出、文件上传、国际化和本地化、验证等方面的知识点,旨在帮助开发者快速掌握 SpringMVC ...

    SpringMVC接收多个对象的4种方法

    在后端,控制器使用数组类型参数来接收这些数据,然后遍历数组创建User对象并存储到列表中。这种方法简单直接,但需要手动处理数组索引,且不适用于更复杂的结构。 2. **表单提交,以BeanListModel接收** 这种方法...

    Spring MVC不能直接接收list类型参数的问题

    针对上述问题,有两种主要的方法可以解决 Spring MVC 无法直接接收 List 类型参数的问题: ##### 方法一:使用 jQuery 的 traditional 参数 在 AJAX 请求中添加 `traditional: true` 参数,以确保数组类型的参数被...

Global site tag (gtag.js) - Google Analytics