2012-01-27 16 views
29

Açıklamalı Spring 3.1 MVC kodunu (spring-mvc) kullanıyorum ve tarih nesnesini @RequestBody yoluyla gönderdiğimde tarih sayısal olarak gösteriliyor. Bu benim denetleyicisiYay 3.1 JSON tarih biçimi

@Controller 
@RequestMapping("/test") 
public class MyController { 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Date.class, 
        new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); 
    } 


    @RequestMapping(value = "/getdate", method = RequestMethod.GET) 
    public @ResponseBody Date getDate(@RequestParam("dt") Date dt, Model model) { 
     // dt is properly constructed here.. 
     return new Date(); 
    } 
} 

i tarihten geçmek olduğunu i biçiminde bir tarih almayı mümkün. Ama benim tarayıcı görüntüler

1327682374011 

Nasıl ben webbinder kayıt hakkı kazandıkları biçimde tarih görüntülemek yapabilirim gibi sayısal tarih? Bazı forumlarda jackson mapper kullanmam gerektiğini gördüm, ancak mevcut mapper'i değiştiremiyorum? Aşağıdaki Jaksonun varsayılan tarih biçimlendirme stratejisini iptal etmek için telefon

cevap

45

adım takip etmek şunlardır:

  1. geçersiz kılma serialize(Date date, JsonGenerator gen, SerializerProvider provider) işlev biçim bugüne kadar tarih biçimlendirme işlemek için yeni bir sınıf oluşturmak için JsonSerializer uzatın senin formatını istenen ve örneği (gen) jeneratöre geri yazma
  2. kullanarak genişletilmiş json seri hale kullanmak için tarih alıcı nesne ek açıklama @JsonSerialize(using = CustomDateSerializer.class)

Kodu:

//CustomDateSerializer class 
public class CustomDateSerializer extends JsonSerializer<Date> {  
    @Override 
    public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) throws 
     IOException, JsonProcessingException {  

     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
     String formattedDate = formatter.format(value); 

     gen.writeString(formattedDate); 

    } 
} 


//date getter method 
@JsonSerialize(using = CustomDateSerializer.class) 
public Date getDate() { 
    return date; 
} 

Kaynak: http://blog.seyfi.net/2010/03/how-to-control-date-formatting-when.html

+0

Teşekkür Waqas: Burada

<!-- you can't call it objectMapper for some reason --> <bean name="jacksonObjectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="featuresToDisable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS"/> </array> </property> </bean> <!-- setup spring MVC --> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" ref="jacksonObjectMapper"/> </bean> </mvc:message-converters> </mvc:annotation-driven> 

ek belgeler olduğunu. İlkbaharda varsayılan JSON Serializer'ın sınıf yolunda jackson kavanozlarının olmadığı gibi nasıl çalıştığını merak ediyordum. Muhtemelen Jackson kullanmaz. – moh

+3

@moh Neden cevap kabul edilmiyor? –

+0

@ M.AtifRiaz Kullanıcı 22:12 18:27 tarihinden beri aktif değil. :) – Yubaraj

16
Alternatif

Eğer jackson kullanarak ve (değil sadece açıklama olanlar) tüm tarihlerde ISO-8601 tarihini istiyorsanız, sen yazma varsayılan devre dışı bırakabilir zaman damgaları olarak tarihler. Eğer varsayılan dışında başka biçime tarihleri ​​dönüştürmek istiyorsanız

<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/> 
<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" /> 
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonSerializationConfig" /> 
    <property name="targetMethod" value="disable" /> 
    <property name="arguments"> 
     <list> 
      <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_DATES_AS_TIMESTAMPS</value> 
     </list> 
    </property> 
</bean> 

Sonra bunu yapabilirsiniz:

İşte
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonSerializationConfig" /> 
    <property name="targetMethod" value="setDateFormat" /> 
    <property name="arguments"> 
     <list> 
      <bean class="java.text.SimpleDateFormat"> 
      <constructor-arg value="yyyy-MM-dd'T'HH:mm:ssZ"/> 
      </bean> 
     </list> 
    </property> 
</bean>