2012-01-27 31 views
29

Estoy usando el código anotado Spring 3.1 MVC (spring-mvc) y cuando envío el objeto de fecha a través del @RequestBody la fecha se muestra como numérica. Este es mi controlador dePrimavera 3.1 Formato de fecha 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(); 
    } 
} 

Cuando paso en la fecha, soy capaz de recibir la fecha en el formato. Pero mis navegador muestra la fecha como numérico

1327682374011 

¿Cómo hago que mostrar la fecha en el formato que se hayan registrado por webbinder? Vi en algún foro que debería usar el mapeador jackson, pero ¿no puedo alterar el mapeador existente?

Respuesta

45

Con el fin de anular la estrategia de formato de fecha predeterminado de Jakson siguientes son los pasos a seguir:

  1. Extender JsonSerializer para crear una nueva clase para manejar el formato de fechas
  2. Anulación serialize(Date date, JsonGenerator gen, SerializerProvider provider) función para el formato de fecha en su formato deseado y escribir de nuevo al generador instancia (GEN)
  3. Anotar la fecha objeto captador de usar el serializador JSON extendida usando @JsonSerialize(using = CustomDateSerializer.class)

Código:

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

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

+0

Gracias Waqas. Me preguntaba cómo funciona el serializador JSON predeterminado en la primavera, ya que no tengo jackson jack en el classpath. probablemente no use jackson. – moh

+3

@moh ¿Por qué no hay una respuesta aceptada? –

+0

@ M.AtifRiaz El usuario no está activo desde el 22 de octubre de 2012 a las 18:27. :) – Yubaraj

16

Alternativamente, si usted está usando Jackson y desea una fecha ISO-8601 en todas las fechas (no sólo los que realizar anotaciones), puede desactivar el valor por defecto de la escritura fechas como marcas de tiempo.

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

Entonces, si desea convertir las fechas en algún otro formato distinto al predeterminado, se puede hacer esto:

<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

Aquí es una forma más estándar para configurar esto, utilizando las fechas ISO8601, que es lo que recomendaría para tu 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> 

Aquí es documentación adicional: