• SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换


    SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换

    场景一:表单中的日期字符串和JavaBean的Date类型的转换

    在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换, 例如,如下代码S_ROLE_QO这个bean中包含有Date类型属性,不处理就拿不到值。

        /**

         * 分页取角色列表

         * @param s_ROLE_QO 角色查询条件

         * @return

         */

        @RequestMapping(value = "/loadRoles", method = RequestMethod.GET)

        @ResponseBody

        public ServerResponse<List<S_ROLE_EO>> loadRoles( S_ROLE_QO s_ROLE_QO) {

            PageHelper.startPage(s_ROLE_QO.getPageIndex(), s_ROLE_QO.getPageSize());

            List<S_ROLE_EO> lst = s_ROLE_DAO.getRolesByConditionWithPaging(s_ROLE_QO);

            PageInfo<S_ROLE_EO> page = new PageInfo<S_ROLE_EO>(lst);

            return new ServerResponse<List<S_ROLE_EO>>(1, null, lst, page.getTotal());

        }

    而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题。

    WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。

    代码如下:

        public static String GREGORIAN_DATEFORMAT= "EEE MMM dd yyyy hh:mm:ss z";

        

        //将表单中特定日期类型的日期字符串转换成Javabean中的日期类型的属性

        @InitBinder

        protected void initBinder(WebDataBinder binder) {

            SimpleDateFormat dateFormat = new SimpleDateFormat(GREGORIAN_DATEFORMAT, Locale.ENGLISH);

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

        }

    场景二:Json中的日期字符串和JavaBean的Date类型的转换

    还是上面的代码,只不过加了个@RequestBody,采用json格式传参

    这个时候处理方式:

    往工程中引入以下包,如果是maven工程,在pom文件中加入

        <dependency>

                <groupId>com.fasterxml.jackson.core</groupId>

                <artifactId>jackson-core</artifactId>

                <version>2.7.3</version>

            </dependency>

            <dependency>

                <groupId>com.fasterxml.jackson.core</groupId>

                <artifactId>jackson-annotations</artifactId>

                <version>2.7.3</version>

            </dependency>

            <dependency>

                <groupId>com.fasterxml.jackson.core</groupId>

                <artifactId>jackson-databind</artifactId>

                <version>2.7.3</version>

            </dependency>

    然后在工具包添加如下工具类:

    @Component

    public class JsonDateSerializer extends JsonSerializer<Date> {

        @Override

        public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

            jsonGenerator.writeString(DateUtil.format(date));

        }

    }

    public class JsonDateDeSerializer extends JsonDeserializer<Date> {

        @Override

        public Date deserialize(JsonParser p, DeserializationContext ctxt)

                throws IOException, JsonProcessingException {

            String dataFormat=null;

            String date = p.getText();

            // 判断客户端传过来的是否是UTC类型

            if (p.getText().contains("Z")) {

                dataFormat="yyyy-MM-dd'T'HH:mm:ss.SSS Z";

                date=date.replace("Z", " UTC");

            }

            return    DateUtil.format(date,dataFormat) ;

        }

    }

    /**

    * 日期工具类

    *

    * Date类型转换为日期字符串之间的转换

    *

    */

    public class DateUtil {

        /**

         * Date类型转换为字符串

         *

         * @param date

         * 日期类型

         * @return日期字符串

         */

        public static String format(Date date) {

            return format(date, "yyyy-MM-dd HH:mm:ss");

        }

        /**

         * Date类型转换为字符串

         *

         * @param date

         * 日期类型

         * @param pattern

         * 字符串格式

         * @return日期字符串

         */

        public static String format(Date date, String pattern) {

            if (date == null) {

                return "null";

            }

            if (pattern == null || pattern.equals("") || pattern.equals("null")) {

                pattern = "yyyy-MM-dd HH:mm:ss";

            }

            return new java.text.SimpleDateFormat(pattern).format(date);

        }

        /**

         * 将字符串转换为Date类型

         *

         * @param date

         * 字符串类型

         * @return日期类型

         */

        public static Date format(String date) {

            return format(date, null);

        }

        /**

         * 将字符串转换为Date类型

         *

         * @param date

         * 字符串类型

         * @param pattern

         * 格式

         * @return日期类型

         */

        public static Date format(String date, String pattern) {

            if (pattern == null || pattern.equals("") || pattern.equals("null")) {

                pattern = "yyyy-MM-dd HH:mm:ss";

            }

            if (date == null || date.equals("") || date.equals("null")) {

                return new Date();

            }

            Date d = null;

            try {

                 SimpleDateFormat sdf = new SimpleDateFormat(pattern);

                if (pattern.equals("yyyy-MM-dd'T'HH:mm:ss.SSS Z")) {

                     sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

                }

                d = sdf.parse(date);

            } catch (ParseException pe) {

            }

            return d;

        }

        

    }

    最后在JavaBean的Date类型属性的get set方法上添加如下注解,注意springMVC的注解驱动<mvc:annotation-driven> 要配置

    @JsonSerialize(using = JsonDateSerializer.class)

        public Date getCreateTimeStart() {

            return createTimeStart;

        }

        @JsonDeserialize(using = JsonDateDeSerializer.class)

        public void setCreateTimeStart(Date createTimeStart) {

            this.createTimeStart = createTimeStart;

        }

        

  • 相关阅读:
    原码、反码、补码,计算机中负数的表示
    [转]Vue 2.0——渐进式前端解决方案
    关于MySQL的tinyint(3)问题
    js对象的深拷贝及其的几种方法
    深入 js 深拷贝对象
    JS 数组克隆方法总结
    Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
    邮件措辞小计
    Forbidden You don't have permission to access / on this server PHP
    正则表达式
  • 原文地址:https://www.cnblogs.com/mengjinluohua/p/8657532.html
Copyright © 2020-2023  润新知