`

SpringMVC自定义时间类型转换

阅读更多

springmvc中Controller在接收前端传递参数的时候

public Map<String ,String> save(T bean)

 

 我们一般是这样来定义接收的bean对象,其中bean对象中的时间类型,我们会定义为Date,

那么在前端进行参数传递的时候,前端传递的时间如:2017-01-18是一个字符串和我们bean对象不匹配,那么就需要进行转换。

现在我这里定义了一个

@Controller
@RequestMapping(value = "/base")
public abstract class BaseController<T>

 

BaseController为Controller继承的一个父类来统一处理

    代码如下:

 @InitBinder
protected void initBinder(WebDataBinder binder) {

        //自定义全局时间接收转换处理
binder.registerCustomEditor(Date.class, new DateEditor());

//        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
//            @Override
//            public void setAsText(String value) {
//                 setValue(new Date(Long.valueOf(value)));
//            }
//        });

}

   其中注释掉部分为传统写法,我这里,自定义了一个类型来接处理时间类型

   自定义类:DateEditor

  

package org.moon.framework.util.date;

import java.beans.PropertyEditorSupport;
import java.text.SimpleDateFormat;

import java.util.Date;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.moon.framework.util.exception.FrameworkException;
import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


/**
 * 自定义SpringMVC 时间格式转义
 */
public class DateEditor 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 {
        try {
            // Treat empty String as null value.
            if (StringUtils.isBlank(text)) {
                setValue(null);
                return;
            }
            //如果时间类型值为直接是数字的情况  12位数字
            if(text.matches("^[0-9]{12}.*")) {
                Date date  = new Date(Long.valueOf(text));
                setValue(date);
            } else {
                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) : "");

    }



    public static Date dateAdapter(String dateStr) throws FrameworkException {
        Date date = null;
        String temp=dateStr;//缓存原始数据
        if(dateStr.contains("CST")){
            date = new Date(dateStr);
            return date;
        }
        if(StringUtils.isBlank(dateStr)){
            return date;
        }
        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";
        } else if(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";
        } else if(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(StringUtils.isNotBlank(fm)){
            date = DateUtilServer.stringToDate(dateStr,fm);
        }
        return date;
    }

}

  其中if(text.matches("^[0-9]{12}.*"))是对使用hibernate时间类型为乐观锁的处理

 希望能够帮助到你们 

 

分享到:
评论

相关推荐

    SpringMVC自定义类型转换器实现解析

    SpringMVC自定义类型转换器实现解析 SpringMVC框架中,类型转换器是一种非常有用的功能,它可以将用户输入的字符串转换为对应的Java对象,例如将字符串“2019-12-05”转换为Date对象。然而,在实际应用中,我们可能...

    SpringMVC实现自定义类型转换器

    SpringMVC实现自定义类型转换器 SpringMVC框架提供了强大的类型转换功能,以便将HTTP请求参数转换成Java对象。但是,默认情况下,SpringMVC只能转换基本数据类型,如String转换成Integer、Double等。如果需要将...

    SSM笔记-自定义类型转换器

    注册自定义转换器有两种方式: - 直接在Spring配置文件中使用`&lt;mvc:annotation-driven conversion-service="conversionServiceRef"&gt;`,然后在bean定义中指定`ConversionService`。 - 或者通过编程式注册,例如在...

    Springmvc自定义类型转换器实现步骤

    但当遇到自定义的格式或者特殊的转换需求时,就需要自定义转换器。 二、自定义类型转换器实现步骤 1. 定义转换器类 要创建自定义类型转换器,你需要创建一个新的Java类,然后实现`Converter, T&gt;`接口。其中,`S`...

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

    ### SpringMVC 数据类型转换详解 #### 一、引言 在开发基于SpringMVC的Web应用程序时,数据类型转换、验证以及格式化是至关重要的环节。这些操作确保了前端输入的数据能够正确地被后端理解和处理,并且保证了系统...

    springmvc实现自定义类型转换器示例

    Spring MVC提供了内置的类型转换器,但当系统需要处理自定义数据类型时,可能需要自定义类型转换器。本篇文章将详细讲解如何在Spring MVC中实现自定义类型转换器。 首先,自定义类型转换器需要实现Spring的核心接口...

    SpringMVC自定义多视图

    例如,我们可以创建一个自定义的ViewResolver实现,重写`resolveViewName`方法,该方法接受视图名和本地化信息作为参数,然后根据视图名返回相应的视图实例。视图实例可以是任何形式的,如FreeMarker模板、Thymeleaf...

    springmvc自定义属性编辑器和参数解析器

    属性编辑器(PropertyEditor)是Java Bean规范的一部分,它允许我们在程序中将一种类型的数据转换为另一种类型。在Spring MVC中,当控制器方法接收请求参数时,如果请求参数与方法参数类型不匹配,Spring会尝试使用...

    Springmvc自定义参数转换实现代码解析

    SpringMVC自定义参数转换实现代码解析 在 SpringMVC 框架中,参数绑定是指将 HTTP 请求中的参数绑定到控制器的方法参数上。SpringMVC 提供了多种参数绑定的方式,包括默认的参数绑定、简单类型参数绑定、POJO 类型...

    SpringMVC中午+自定义转换器-2021-04-10.txt

    在进行web项目的开发时,如果时间让用户自己输入,该怎么处理,SpringMVC的转换器可以处理,但是需要自己定义,如何定义和搭配呢?

    Spring MVC自定义日期类型转换器实例详解

    在介绍自定义转换器之前,首先需要明确转换器的作用和重要性。在Web层与APP端或客户端的数据交互中,尤其是涉及到日期类型的数据时,通常需要将其转换为字符串格式进行传输。如果转换不正确或不符合约定的格式,可能...

    Spring MVC学习(七)-------SpringMVC数据类型转换

    ### Spring MVC 数据类型转换详解 #### 一、背景与需求 在进行Web应用开发时,尤其是在使用Spring MVC框架的过程中,经常需要对用户提交的数据进行处理,包括但不限于数据类型转换、数据验证以及数据格式化等操作...

    详解自定义SpringMVC的Http信息转换器的使用

    在SpringMVC配置中,你需要将这个自定义转换器添加到`MessageConverter`列表中,这样SpringMVC就会在处理请求和响应时考虑它。可以通过`@Configuration`类和`WebMvcConfigurerAdapter`的扩展来实现这一点: ```java...

    自定义的springMVC

    - **自定义转换器和格式化器(Converter & Formatter)**:如果需要处理的数据类型SpringMVC不支持,可以创建自定义的转换器或格式化器,实现Converter或Formatter接口,将它们注册到SpringMVC上下文中,以处理特定...

    SpringMVC-8 数据类型转换、数据格式化与数据校验

    我们可以通过配置`@InitBinder`方法或自定义`DataBinder`来控制特定类型的转换规则。 接下来是数据格式化。数据格式化主要涉及日期、数字等的展示形式。例如,日期可能需要按照特定的区域设置(如"yyyy-MM-dd"或"MM...

    SpringMVC数据绑定及数据类型转换

    但是,当请求参数的类型与控制器方法参数类型不匹配时,就需要自定义转换器。例如,如果用户输入的年龄是字符串,而我们的`User`类的`age`字段是整型,SpringMVC会尝试自动进行转换。 自定义数据类型转换可以通过...

    专题资料(2021-2022年)SpringMVC数据类型转换要点.doc

    - **类型转换器(Converter)**:`Converter`接口用于定义自定义类型转换逻辑。`ConversionService`自动发现并注册这些转换器,使得转换过程自动化且类型安全。 - **格式化器(Formatter)**:`Formatter`接口用于...

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证

    例如,我们可以自定义`Converter`或`Formatter`来处理特定类型的转换,如将日期字符串转换为`java.util.Date`对象。默认情况下,Spring MVC提供了一些内置的转换器,可以处理基本类型和简单对象的转换。 然后,**...

    springmvc类型转换.md

    本文将详细介绍Spring MVC中的类型转换机制,并通过具体的示例来阐述如何实现自定义类型转换。 #### 二、使用注解进行日期格式化 ##### 1. 使用`@DateTimeFormat`注解 在Spring MVC中,可以通过`@DateTimeFormat`...

    springMVC三种数据转换的Demo

    `@ModelAttribute`适用于将整个请求参数映射到一个对象,而`Converter`和`CustomEditor`则更适用于自定义类型转换,尤其是涉及到复杂的转换逻辑时。在实际开发中,可以根据项目需求灵活选择和组合使用这些方法。在本...

Global site tag (gtag.js) - Google Analytics