2012-01-27 46 views
29

Tôi đang sử dụng mã Spring 3.1 MVC có chú thích (spring-mvc) và khi tôi gửi đối tượng ngày qua @RequestBody ngày hiển thị dưới dạng số. Đây là bộ điều khiển của tôiMùa xuân 3.1 Định dạng ngày JSON

@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(); 
    } 
} 

Khi tôi chuyển ngày, tôi có thể nhận được ngày theo định dạng. Nhưng trình duyệt của tôi hiển thị ngày dưới dạng số

1327682374011 

Làm cách nào để hiển thị ngày theo định dạng mà tôi đã đăng ký cho webbinder? Tôi thấy trong một số diễn đàn rằng tôi nên sử dụng mapper jackson, nhưng tôi không thể thay đổi người lập bản đồ hiện tại?

Trả lời

45

Để ghi đè lên các chiến lược định dạng ngày mặc định của Jakson Sau đây là các bước để làm theo:

  1. Mở rộng JsonSerializer để tạo ra một lớp mới để xử lý định dạng ngày tháng
  2. Override serialize(Date date, JsonGenerator gen, SerializerProvider provider) chức năng để cập nhật định dạng trong của bạn định dạng mong muốn và viết lại cho phiên bản máy phát điện (gen)
  3. Chú thích đối tượng getter ngày của bạn để sử dụng bộ nối tiếp json mở rộng của bạn sử dụng @JsonSerialize(using = CustomDateSerializer.class)

Code:

//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; 
} 

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

+0

Cảm ơn Waqas. Tôi đã tự hỏi làm thế nào mặc định JSON Serializer trong mùa xuân hoạt động như tôi không có jackson jackson trong classpath này. có lẽ nó không sử dụng jackson. – moh

+3

@moh Tại sao không có câu trả lời được chấp nhận? –

+0

@ M.AtifRiaz Người dùng không hoạt động kể từ ngày 22 tháng 10 '12 lúc 18:27. :) – Yubaraj

16

Ngoài ra nếu bạn đang sử dụng jackson và muốn một ngày theo tiêu chuẩn ISO-8601 trên tất cả các ngày (không chỉ những bạn chú thích), bạn có thể vô hiệu hóa mặc định của văn bản ngày làm dấu thời gian.

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

Sau đó, nếu bạn muốn chuyển đổi ngày của bạn vào một số định dạng khác với mặc định, bạn có thể làm điều này:

<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> 
5

Đây là một cách tiêu chuẩn hơn để cấu hình này, sử dụng ngày ISO8601, mà là những gì tôi muốn giới thiệu cho API của bạn.

<!-- 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> 

Đây là tài liệu bổ sung:

Các vấn đề liên quan