zoukankan      html  css  js  c++  java
  • Spring MVC JSON自己定义类型转换(续)

    前面提到了两种转换类型的方法(Spring MVC JSON自己定义类型转换),这里针对Json转换提供一种更简便的方法。


    通过配置全局的日期转换来避免使用麻烦的注解。


    首先用到了一个简单的日期工具类DateUtil.java

    /**
     * DateUtil类
     *
     * @author liuzh
     */
    public class DateUtil {
    
        public static final String Y_M_D = "yyyy-MM-dd";
        public static final String Y_M_D_HM = "yyyy-MM-dd HH:mm";
        public static final String Y_M_D_HMS = "yyyy-MM-dd HH:mm:ss";
        public static final String YMD = "yyyyMMdd";
        public static final String YMDHM = "yyyyMMddHHmm";
        public static final String YMDHMS = "yyyyMMddHHmmss";
        public static final String ymd = "yyyy/MM/dd";
        public static final String ymd_HM = "yyyy/MM/dd HH:mm";
        public static final String ymd_HMS = "yyyy/MM/dd HH:mm:ss";
    
        /**
         * 智能转换日期
         *
         * @param date
         * @return
         */
        public static String smartFormat(Date date) {
            String dateStr = null;
            if (date == null) {
                dateStr = "";
            } else {
                try {
                    dateStr = formatDate(date, Y_M_D_HMS);
                    //时分秒
                    if (dateStr.endsWith(" 00:00:00")) {
                        dateStr = dateStr.substring(0, 10);
                    }
                    //时分
                    else if (dateStr.endsWith("00:00")) {
                        dateStr = dateStr.substring(0, 16);
                    }
                    //秒
                    else if (dateStr.endsWith(":00")) {
                        dateStr = dateStr.substring(0, 16);
                    }
                } catch (Exception ex) {
                    throw new IllegalArgumentException("转换日期失败: " + ex.getMessage(), ex);
                }
            }
            return dateStr;
        }
    
        /**
         * 智能转换日期
         *
         * @param text
         * @return
         */
        public static Date smartFormat(String text) {
            Date date = null;
            try {
                if (text == null || text.length() == 0) {
                    date = null;
                } else if (text.length() == 10) {
                    date = formatStringToDate(text, Y_M_D);
                } else if (text.length() == 13) {
                    date = new Date(Long.parseLong(text));
                } else if (text.length() == 16) {
                    date = formatStringToDate(text, Y_M_D_HM);
                } else if (text.length() == 19) {
                    date = formatStringToDate(text, Y_M_D_HMS);
                } else {
                    throw new IllegalArgumentException("日期长度不符合要求!");
                }
            } catch (Exception e) {
                throw new IllegalArgumentException("日期转换失败!");
            }
            return date;
        }
    
        /**
         * 获取当前日期
         * @param format
         * @return
         * @throws Exception
         */
        public static String getNow(String format) throws Exception{
            return formatDate(new Date(), format);
        }
    
        /**
         * 格式化日期格式
         *
         * @param argDate
         * @param argFormat
         * @return 格式化后的日期字符串
         */
        public static String formatDate(Date argDate, String argFormat) throws Exception {
            if (argDate == null) {
                throw new Exception("參数[日期]不能为空!");
            }
            if (StringUtils.isEmpty(argFormat)) {
                argFormat = Y_M_D;
            }
            SimpleDateFormat sdfFrom = new SimpleDateFormat(argFormat);
            return sdfFrom.format(argDate).toString();
        }
    
        /**
         * 把字符串格式化成日期
         *
         * @param argDateStr
         * @param argFormat
         * @return
         */
        public static Date formatStringToDate(String argDateStr, String argFormat) throws Exception {
            if (argDateStr == null || argDateStr.trim().length() < 1) {
                throw new Exception("參数[日期]不能为空!");
            }
            String strFormat = argFormat;
            if (StringUtils.isEmpty(strFormat)) {
                strFormat = Y_M_D;
                if (argDateStr.length() > 16) {
                    strFormat = Y_M_D_HMS;
                } else if (argDateStr.length() > 10) {
                    strFormat = Y_M_D_HM;
                }
            }
            SimpleDateFormat sdfFormat = new SimpleDateFormat(strFormat);
            //严格模式
            sdfFormat.setLenient(false);
            try {
                return sdfFormat.parse(argDateStr);
            } catch (ParseException e) {
                throw new Exception(e);
            }
        }
    }

    须要用到的是两个智能转换日期的方法。

    关于转换的格式和规则,请看这两个方法,假设不符合你须要的。能够自行改动。


    然后继承SimpleDateFormat写一个智能转换日期的类SmartDateFormat

    /**
     * Description: 智能日期转换
     * Author: liuzh
     */
    public class SmartDateFormat extends SimpleDateFormat {
        @Override
        public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) {
            return new StringBuffer(DateUtil.smartFormat(date));
        }
    
        @Override
        public Date parse(String text) throws ParseException {
            return DateUtil.smartFormat(text);
        }
    }
    
    这里重写了两个方法,这两个方法是互相转换的方法,直接调用的DateUtil提供的两个智能转换的方法。


    最后在Spring MVC的xml中配置:

        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
          <property name="objectMapper">
            <bean class="org.codehaus.jackson.map.ObjectMapper">
              <property name="dateFormat">
                <!-- 智能日期转换 -->
                <bean class="packageName.SmartDateFormat"/>
              </property>
            </bean>
          </property>
        </bean>
    这段代码主要是针对MappingJacksonHttpMessageConverter进行配置。经过这种配置之后,Spring就能自己主动依据日期样式进行转换了。


    至于“智能”转换,全然就是简单的if/else推断,能够查看最上面的代码。



  • 相关阅读:
    URAL 2046 A
    URAL 2056 Scholarship 水题
    Codeforces Gym 100286I iSharp 水题
    Codeforces Gym H. Hell on the Markets 贪心
    Codeforces Gym 100286G Giant Screen 水题
    Codeforces Gym 100286B Blind Walk DFS
    Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
    Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
    Codeforces Gym 100418K Cards 暴力打表
    Codeforces Gym 100418J Lucky tickets 数位DP
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6855432.html
Copyright © 2011-2022 走看看