天天看點

Spring MVC JSON自定義類型轉換(續)

通過配置全局的日期轉換來避免使用麻煩的注解。

首先用到了一個簡單的日期工具類dateutil.java

[java] view

plain copy

Spring MVC JSON自定義類型轉換(續)
Spring MVC JSON自定義類型轉換(續)

/** 

 * 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")) {  

            } catch (exception ex) {  

                throw new illegalargumentexception("轉換日期失敗: " + ex.getmessage(), ex);  

            }  

        }  

        return datestr;  

    }  

     * @param text 

    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 

     * @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 

    public static date formatstringtodate(string argdatestr, string argformat) throws exception {  

        if (argdatestr == null || argdatestr.trim().length() < 1) {  

        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);  

            return sdfformat.parse(argdatestr);  

        } catch (parseexception e) {  

            throw new exception(e);  

}  

需要用到的是兩個智能轉換日期的方法。關于轉換的格式和規則,請看這兩個方法,如果不符合你需要的,可以自行修改。

然後繼承simpledateformat寫一個智能轉換日期的類smartdateformat

Spring MVC JSON自定義類型轉換(續)
Spring MVC JSON自定義類型轉換(續)

 * description: 智能日期轉換 

 * author: liuzh 

public class smartdateformat extends simpledateformat {  

    @override  

    public stringbuffer format(date date, stringbuffer toappendto, fieldposition pos) {  

        return new stringbuffer(dateutil.smartformat(date));  

    public date parse(string text) throws parseexception {  

        return dateutil.smartformat(text);  

這裡重寫了兩個方法,這兩個方法是互相轉換的方法,直接調用的dateutil提供的兩個智能轉換的方法。

最後在spring mvc的xml中配置:

[html] view

Spring MVC JSON自定義類型轉換(續)
Spring MVC JSON自定義類型轉換(續)

<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判斷,可以檢視最上面的代碼。