<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    cuiyi's blog(崔毅 crazycy)

    記錄點(diǎn)滴 鑒往事之得失 以資于發(fā)展
    數(shù)據(jù)加載中……

    SpringMVC+MyBatis - 12 spring mvc4返回的json日期為L(zhǎng)ong的解決方案

    Spring MVC 4.X ResponseBody 日期類型Json 處理

    摘自http://tramp-zzy.iteye.com/blog/2090330  2014-07-10
    方法一:全局處理
    <mvc:annotation-driven>  
        <!-- 處理responseBody 里面日期類型 -->  
            <mvc:message-converters>  
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
                    <property name="objectMapper">  
                        <bean class="com.fasterxml.jackson.databind.ObjectMapper">  
                            <property name="dateFormat">  
                                <bean class="java.text.SimpleDateFormat">  
                                    <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />  
                                </bean>  
                            </property>  
                        </bean>  
                    </property>  
                </bean>  
            </mvc:message-converters>  
        </mvc:annotation-driven>  
    方法二:局部注解處理 
    import java.io.IOException;  
    import java.text.SimpleDateFormat;  
    import java.util.Date;  
      
    import com.fasterxml.jackson.core.JsonGenerator;  
    import com.fasterxml.jackson.core.JsonProcessingException;  
    import com.fasterxml.jackson.databind.JsonSerializer;  
    import com.fasterxml.jackson.databind.SerializerProvider;  
      
    /**  
     * ClassName:DateJsonSerializer <br/>  
     * Function: 日期類型格式化,格式化為:yyyy-MM-dd HH:mm:ss 格式. 用法如下:<br/>  
     * Reason:   @JsonSerialize(using=DateJsonSerializer.class) 
     *           @Column(name="BIRTHDAY") 
     *           public Date getBirthday() { 
     *              return birthday; 
     *           } 
     *          . <br/>  
     * Date:     2014年7月10日 下午1:26:08 <br/>  
     * 
    @author   zhangzhaoyu  
     * 
    @version   1.0 
     * 
    @since    JDK 1.7  
     * 
    @see        
     
    */  
    public class DateJsonSerializer extends JsonSerializer<Date> {  
      
        @Override  
        public void serialize(Date value, JsonGenerator jgen,  
                SerializerProvider provider) throws IOException,  
                JsonProcessingException {  
             SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
             String formattedDate = formatter.format(value);  
             jgen.writeString(formattedDate);  
        }  
      
    }  
    方法三:jackson 注解處理
    @JsonIgnoreProperties  
             此注解是類注解,作用是json序列化時(shí)將java bean中的一些屬性忽略掉,序列化和反序列化都受影響。  
      
    @JsonIgnore  
             此注解用于屬性或者方法上(最好是屬性上),作用和上面的@JsonIgnoreProperties一樣。  
      
    @JsonFormat  
            此注解用于屬性或者方法上(最好是屬性上),可以方便的把Date類型直接轉(zhuǎn)化為我們想要的模式,比如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")  
      
    @JsonSerialize  
      
     // 反序列化一個(gè)固定格式的Date    
        @JsonDeserialize(using = CustomDateDeserialize.class)    
        public void setBirthday(Date birthday) {    
            this.birthday = birthday;    
        }   
      
     // 序列化指定格式的double格式    
        @JsonSerialize(using = CustomDoubleSerialize.class)    
        public double getSalary() {    
            return salary;    
        }    
      
    public class CustomDateDeserialize extends JsonDeserializer<Date> {    
        
        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");    
        
        @Override    
        public Date deserialize(JsonParser jp, DeserializationContext ctxt)    
                throws IOException, JsonProcessingException {    
        
            Date date = null;    
            try {    
                date = sdf.parse(jp.getText());    
            } catch (ParseException e) {    
                e.printStackTrace();    
            }    
            return date;    
        }    
    }   


    spring mvc4使用及json 日期轉(zhuǎn)換解決方案

    摘自:http://blog.csdn.net/zhanngle/article/details/24123659  2014-04-19
    又到搭新開(kāi)發(fā)環(huán)境的時(shí)候,總是不免去網(wǎng)上搜下目前最新的框架。spring是web開(kāi)發(fā)必用的框架,于是乎下載了目前最新的spring4.0.3,同時(shí)越來(lái)越不想用struts2,想試試spring mvc,也將spring-webmvc4.0.3下了下來(lái),投入兩天時(shí)間學(xué)習(xí)后,發(fā)現(xiàn)還是挺優(yōu)雅的,特別是從3.0后,spring mvc使用注解方式配制,以及對(duì)rest風(fēng)格的支持,真是完美致極。
    下面將這兩天研究到的問(wèn)題做個(gè)總結(jié),供參考。
    1.request對(duì)象的獲取
    方式1:
    在controller方法上加入request參數(shù),spring會(huì)自動(dòng)注入,如:
    public String list(HttpServletRequest request,HttpServletResponse response)
    方式2:在controller類中加入@Resource private HttpServletRequest request 屬性,spring會(huì)自動(dòng)注入,這樣不知道會(huì)不會(huì)出現(xiàn)線程問(wèn)題,因?yàn)橐粋€(gè)controller實(shí)例會(huì)為多個(gè)請(qǐng)求服務(wù),暫未測(cè)試。
    方式3:在controller方法中直接寫代碼獲取 
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
    方式4:在controller中加入以下方法,此方法會(huì)在執(zhí)行此controller的處理方法之前執(zhí)行
    @ModelAttribute  
    private void initServlet(HttpServletRequest request,HttpServletResponse response) {  
        //String p=request.getParameter("p");  
        
    //this.req=request;//實(shí)例變量,有線程安全問(wèn)題,可以使用ThreadLocal模式保存  
    }  

    2.response對(duì)象的獲取

    可以參照以上request的獲取方式1和方式4,方式2和方式3對(duì)response對(duì)象無(wú)效!
    3.表單提交之?dāng)?shù)據(jù)填充

    直接在方法上加入實(shí)體對(duì)象參數(shù),spring會(huì)自動(dòng)填充對(duì)象中的屬性,對(duì)象屬性名要與<input>的name一致才會(huì)填充.
    如:public boolean doAdd(Demo demo)

    4.表單提交之?dāng)?shù)據(jù)轉(zhuǎn)換-Date類型

    在實(shí)體類的屬性或get方法上加入 @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss"),那么表單中的日期字符串就會(huì)正確的轉(zhuǎn)換為Date類型了。
    還有@NumberFormat注解,暫時(shí)沒(méi)用,就不介紹了,一看就知道是對(duì)數(shù)字轉(zhuǎn)換用的。

    5.json數(shù)據(jù)返回
    在方法上加入@ResponseBody,同時(shí)方法返回值為實(shí)體對(duì)象,spring會(huì)自動(dòng)將對(duì)象轉(zhuǎn)換為json格式,并返回到客戶端。如下所示:
    @RequestMapping("/json1")  
    @ResponseBody  
    public Demo json1() {  
        Demo demo=new Demo();  
        demo.setBirthday(new Date());  
        demo.setCreateTime(new Date());  
        demo.setHeight(170);  
        demo.setName("tomcat");   
        demo.setRemark("json測(cè)試");   
        demo.setStatus((short)1);   
        return demo;  
    }  
    注意:spring配置文件要加上:<mvc:annotation-driven/>,同時(shí)還要引入jackson-core.jar,jackson-databind.jar,jackson-annotations.jar(2.x的包)才會(huì)自動(dòng)轉(zhuǎn)換json
    這種方式是spring提供的。我們還可以自定義輸出json,以上第二條不是說(shuō)了獲取response對(duì)象嗎,拿到response對(duì)象后,任由開(kāi)發(fā)人員宰割,想怎么返回就怎么返回。
    方法不要有返回值,如下:
    @RequestMapping("/json2")  
    public void json2() {  
        Demo demo=new Demo();  
        demo.setBirthday(new Date());  
        demo.setCreateTime(new Date());  
        demo.setHeight(170);  
        demo.setName("tomcat");  
        demo.setRemark("json測(cè)試");  
        demo.setStatus((short)1);  
        String json=JsonUtil.toJson(obj);//;json處理工具類  
        HttpServletResponse response = //獲取response對(duì)象  
        response.getWriter().print(json);  

    }  
    OK,一切很完美。接著惡心的問(wèn)題迎面而來(lái),date類型轉(zhuǎn)換為json字符串時(shí),返回的是long time值,如果你想返回“yyyy-MM-dd HH:mm:ss”格式的字符串,又要自定義了。我很奇怪,不是有@DateTimeFormat注解嗎,為什么不利用它。難道@DateTimeFormat只在表單提交時(shí),將字符串轉(zhuǎn)換為date類型,而date類型轉(zhuǎn)換為json字符串時(shí),就不用了。帶著疑惑查源碼,原來(lái)spring使用jackson轉(zhuǎn)換json字符,而@DateTimeFormat是spring-context包中的類,jackson如何轉(zhuǎn)換,spring不方便作過(guò)多干涉,于是只能遵守jackson的轉(zhuǎn)換規(guī)則,自定義日期轉(zhuǎn)換器。
    先寫一個(gè)日期轉(zhuǎn)換器,如下:
    public class JsonDateSerializer extends JsonSerializer<Date> {  
       private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
       @Override  
       public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)  throws IOException, JsonProcessingException {  
           String value = dateFormat.format(date);  
           gen.writeString(value);  
       }  
    }  
    在實(shí)體類的get方法上配置使用轉(zhuǎn)換器,如下:
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")  
    @JsonSerialize(using=JsonDateSerializer.class)  
    public Date getCreateTime() {  
        return this.createTime;  
    }  
    OK,到此搞定。
    你真的滿意了嗎,這么不優(yōu)雅的解決方案,假設(shè)birthday屬性是這樣的,只有年月日,無(wú)時(shí)分秒
    @DateTimeFormat(pattern="yyyy-MM-dd")  
    public Date getBirthday() {  
        return this.birthday;  
    }  
    這意味著,又要為它定制一個(gè)JsonDate2Serializer的轉(zhuǎn)換器,然后配置上,像這樣

    @DateTimeFormat(pattern="yyyy-MM-dd")  
    @JsonSerialize(using=JsonDate2Serializer.class)  
    public Date getBirthday() {  
        return this.birthday;  
    }  
    假設(shè)還有其它格式的Date字段,還得要為它定制另一個(gè)轉(zhuǎn)換器。my god,請(qǐng)饒恕我的罪過(guò),不要讓我那么難受
    經(jīng)過(guò)分析源碼,找到一個(gè)不錯(cuò)的方案,此方案將不再使用@JsonSerialize,而只利用@DateTimeFormat配置日期格式,jackson就可以正確轉(zhuǎn)換,但@DateTimeFormat只能配置在get方法上,這也沒(méi)什么關(guān)系。
    先引入以下類,此類對(duì)jackson的ObjectMapper類做了注解掃描攔截,使它也能對(duì)加了@DateTimeFormat的get方法應(yīng)用日期格式化規(guī)則
    package com.xxx.utils;  
      
    import java.io.IOException;  
    import java.lang.reflect.AnnotatedElement;  
    import java.text.SimpleDateFormat;  
    import java.util.Date;  
    import org.springframework.format.annotation.DateTimeFormat;  
    import org.springframework.stereotype.Component;  
    import com.fasterxml.jackson.core.JsonGenerator;  
    import com.fasterxml.jackson.core.JsonProcessingException;  
    import com.fasterxml.jackson.databind.JsonSerializer;  
    import com.fasterxml.jackson.databind.ObjectMapper;  
    import com.fasterxml.jackson.databind.SerializerProvider;  
    import com.fasterxml.jackson.databind.introspect.Annotated;  
    import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;  
    import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;  
      
    /** 
     * json處理工具類 
     * 
    @author zhangle 
     
    */  
    @Component  
    public class JsonUtil {  
            private static final String DEFAULT_DATE_FORMAT="yyyy-MM-dd HH:mm:ss";  
            private static final ObjectMapper mapper;  
              
            public ObjectMapper getMapper() {  
                    return mapper;  
            }  
      
            static {  
                    SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);  
                      
                    mapper = new ObjectMapper();  
                    mapper.setDateFormat(dateFormat);  
                    mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {  
                            @Override  
                            public Object findSerializer(Annotated a) {  
                                    if(a instanceof AnnotatedMethod) {  
                                            AnnotatedElement m=a.getAnnotated();  
                                            DateTimeFormat an=m.getAnnotation(DateTimeFormat.class);  
                                            if(an!=null) {  
                                                    if(!DEFAULT_DATE_FORMAT.equals(an.pattern())) {  
                                                            return new JsonDateSerializer(an.pattern());  
                                                    }  
                                            }  
                                    }  
                                    return super.findSerializer(a);  
                            }  
                    });  
            }  
              
            public static String toJson(Object obj) {  
                    try {  
                            return mapper.writeValueAsString(obj);  
                    } catch (Exception e) {  
                            throw new RuntimeException("轉(zhuǎn)換json字符失敗!");  
                    }  
            }  
              
            public <T> T toObject(String json,Class<T> clazz) {  
                    try {  
                            return mapper.readValue(json, clazz);  
                    } catch (IOException e) {  
                            throw new RuntimeException("將json字符轉(zhuǎn)換為對(duì)象時(shí)失敗!");  
                    }  
            }  
              
            public static class JsonDateSerializer extends JsonSerializer<Date>{  
                private SimpleDateFormat dateFormat;  
                public JsonDateSerializer(String format) {  
                     dateFormat = new SimpleDateFormat(format);  
                    }  
                  
                @Override  
                public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)  
                        throws IOException, JsonProcessingException {  
                    String value = dateFormat.format(date);  
                    gen.writeString(value);  
                }  
            }  
    }  
    再將<mvc:annotation-driven/>改為以下配置,配置一個(gè)新的json轉(zhuǎn)換器,將它的ObjectMapper對(duì)象設(shè)置為JsonUtil中的objectMapper對(duì)象,此轉(zhuǎn)換器比spring內(nèi)置的json轉(zhuǎn)換器優(yōu)先級(jí)更高,所以與json有關(guān)的轉(zhuǎn)換,spring會(huì)優(yōu)先使用它。
    <mvc:annotation-driven>  
        <mvc:message-converters>  
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
                <property name="objectMapper" value="#{jsonUtil.mapper}"/>  
                <property name="supportedMediaTypes">  
                    <list>  
                        <value>text/json;charset=UTF-8</value>  
                    </list>  
                </property>    
            </bean>  
        </mvc:message-converters>  
    </mvc:annotation-driven>  
    接下來(lái)就可以這樣配置實(shí)體類,jackson也能正確轉(zhuǎn)換Date類型
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")  
    public Date getCreateTime() {  
        return this.createTime;  
    }  
    @DateTimeFormat(pattern="yyyy-MM-dd")  
    public Date getBirthday() {  
        return this.birthday;  
    }  

    完畢,一切都完美了。


    以下為2014/4/21 補(bǔ)充

    寫了那么多,發(fā)現(xiàn)白忙活了一場(chǎng),原來(lái)jackson也有一個(gè)@JsonFormat注解,將它配置到Date類型的get方法上后,jackson就會(huì)按照配置的格式轉(zhuǎn)換日期類型,而不自定義轉(zhuǎn)換器類,欲哭無(wú)淚啊。辛苦了那么多,其實(shí)別人早已提供,只是沒(méi)有發(fā)現(xiàn)而已。

    不說(shuō)了,直接上方案吧。

    1.spring配置照樣是這樣:

    1. <mvc:annotation-driven>  
    2.JsonUtil可以不用了,但如果要自己從response對(duì)象輸出json,那么還是可以用,但改成了這樣
    package com.xxx.utils;  
      
    import java.io.IOException;  
    import java.text.SimpleDateFormat;  
    import org.springframework.stereotype.Component;  
    import com.fasterxml.jackson.databind.ObjectMapper;  
      
    /** 
     * json處理工具類 
     * 
    @author zhangle 
     
    */  
    @Component  
    public class JsonUtil {  
      
        private static final String DEFAULT_DATE_FORMAT="yyyy-MM-dd HH:mm:ss";  
        private static final ObjectMapper mapper;  
      
        static {  
            SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);  
            mapper = new ObjectMapper();  
            mapper.setDateFormat(dateFormat);  
        }  
          
        public static String toJson(Object obj) {  
            try {  
                return mapper.writeValueAsString(obj);  
            } catch (Exception e) {  
                throw new RuntimeException("轉(zhuǎn)換json字符失敗!");  
            }  
        }  
          
        public <t> T toObject(String json,Class<t> clazz) {  
            try {  
                return mapper.readValue(json, clazz);  
            } catch (IOException e) {  
                throw new RuntimeException("將json字符轉(zhuǎn)換為對(duì)象時(shí)失敗!");  
            }  
        }  
    }

    3.實(shí)體類的get方法就需要多一個(gè)@JsonFormat的注解配置
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")  
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")  
    public Date getCreateTime() {  
    return this.createTime;  
    }  
    @DateTimeFormat(pattern="yyyy-MM-dd")  
    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")  
    public Date getBirthday() {  
        return this.birthday;  
    }  

    posted on 2014-07-15 14:30 crazycy 閱讀(37652) 評(píng)論(3)  編輯  收藏 所屬分類: JavaEE技術(shù)

    評(píng)論

    # re: SpringMVC+MyBatis - 12 spring mvc4返回的json日期為L(zhǎng)ong的解決方案  回復(fù)  更多評(píng)論   

    rklrmoproporp
    2015-10-30 17:11 | ldpe

    # re: SpringMVC+MyBatis - 12 spring mvc4返回的json日期為L(zhǎng)ong的解決方案[未登錄](méi)  回復(fù)  更多評(píng)論   

    請(qǐng)問(wèn)實(shí)體類有個(gè)字段叫name,序列json時(shí),想把name替換成text,應(yīng)該怎么做呢,在需要進(jìn)行轉(zhuǎn)換時(shí)自定義,不用注解
    2016-05-24 15:48 | coder

    # re: SpringMVC+MyBatis - 12 spring mvc4返回的json日期為L(zhǎng)ong的解決方案  回復(fù)  更多評(píng)論   

    垃圾,根本沒(méi)用
    2016-08-07 23:47 | 省份
    主站蜘蛛池模板: 国产成人综合久久精品亚洲| 最近中文字幕mv免费高清视频7| 国产又粗又猛又爽又黄的免费视频| 亚洲精品国产啊女成拍色拍| 香蕉免费一级视频在线观看| 亚洲M码 欧洲S码SSS222| 亚洲成a人片在线不卡一二三区| 成人免费毛片内射美女-百度| 亚洲精品第一国产综合精品| 少妇太爽了在线观看免费视频| 亚洲国产成人久久综合碰碰动漫3d| 久操视频在线免费观看| 亚洲综合自拍成人| 成人免费福利视频| 亚洲乱码在线卡一卡二卡新区| 在线观看成人免费视频| 亚洲精品乱码久久久久蜜桃| 国产无遮挡裸体免费视频| 思思久久99热免费精品6| 亚洲午夜久久久久妓女影院 | 亚洲av无码不卡私人影院| 国产精品亚洲天堂| 狠狠色婷婷狠狠狠亚洲综合| 三年在线观看免费观看完整版中文 | 免费v片视频在线观看视频| 色噜噜狠狠色综合免费视频| 亚洲午夜福利精品久久| 国产午夜成人免费看片无遮挡| 久久精品蜜芽亚洲国产AV| 台湾一级毛片永久免费| 在线观看亚洲专区| 亚洲春色在线视频| 黄页网站免费观看| 九九久久精品国产免费看小说| 亚洲AV无码一区二区三区DV| 动漫黄网站免费永久在线观看| 青青草97国产精品免费观看 | 亚洲国产精品成人综合色在线婷婷| 成年大片免费视频| 久久免费观看视频| 亚洲精品视频在线免费|