2012-01-27 3 views
29

Я использую аннотированную Spring 3.1 MVC-код (spring-mvc), и когда я отправляю объект даты через @RequestBody, дата отображается как числовая. Это мой контроллерSpring 3.1 Формат даты 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(); 
    } 
} 

Когда я прохожу в день я могу получить дату в формате. Но мой браузер отображается дата, как цифровая

1327682374011 

Как я могу сделать это отображение даты в формате я зарегистрирован webbinder? Я видел в каком-то форуме, что я должен использовать картографию джексона, но не могу изменить существующий картограф?

ответ

45

Чтобы переопределить стратегию форматирования даты по умолчанию в Jakson является следующей шагом следовать:

  1. Продлить JsonSerializer создать новый класс для обработки даты форматирования
  2. Override serialize(Date date, JsonGenerator gen, SerializerProvider provider) функции на сегодняшний день формата в вашем желаемый формат и записать его обратно в генератор экземпляра (GEN)
  3. аннотировать дата объект геттер использовать расширенную JSon сериалайзер использованием @JsonSerialize(using = CustomDateSerializer.class)

Код:

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

Источник: http://blog.seyfi.net/2010/03/how-to-control-date-formatting-when.html

+0

Благодаря Waqas. Мне было интересно, как работает JSON Serializer по умолчанию, поскольку у меня нет джексон-банок в пути к классам. вероятно, он не использует джексон. – moh

+3

@moh Почему нет принятого ответа? –

+0

@ M.AtifRiaz Пользователь не активен с 22 Октября 2012 в 18:27. :) – Yubaraj

16

В качестве альтернативы, если вы используете Джексон и хотите ISO-8601 даты на всех даты (а не только те, которые вы аннотирование), то можно отключить по умолчанию письма даты как временные метки.

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

Затем, если вы хотите преобразовать даты в другой формат, чем по умолчанию, вы можете сделать это:

<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

Вот более стандартный способ настройки этого, используя ISO8601 даты, которые это то, что я бы рекомендовал для вашего API.

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

Вот дополнительная документация:

Смежные вопросы