Spring 3.1 formato de fecha JSON

Estoy usando un código MVC Spring 3.1 anotado (spring-mvc) y cuando envío un objeto date a través de @RequestBody, la fecha aparece como numérica. Este es mi controlador

@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 la fecha, puedo recibir la fecha en el formato. Pero mi navegador muestra la fecha como numérica

 1327682374011 

¿Cómo hago que muestre la fecha en el formato que he registrado para el enlazador web? Vi en algún foro que debería usar el mapeador de jackson, pero ¿puedo modificar el mapeador existente?

Para anular la estrategia de formato de fecha predeterminada de Jakson, a continuación se detallan los pasos a seguir:

  1. Extienda JsonSerializer para crear una nueva clase para manejar el formato de fecha
  2. Sobrescribir la función serialize(Date date, JsonGenerator gen, SerializerProvider provider) para formatear la fecha en el formato que desee y escribirla en la instancia del generador (gen)
  3. Anote su objeto getter de fecha para usar su serializador json extendido usando @JsonSerialize(using = CustomDateSerializer.class)

Código:

 //CustomDateSerializer class public class CustomDateSerializer extends JsonSerializer { @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

Alternativamente, si está usando jackson y quiere una fecha ISO-8601 en todas las fechas (no solo las que anota), puede deshabilitar las fechas de escritura predeterminadas como marcas de tiempo.

        WRITE_DATES_AS_TIMESTAMPS    

Luego, si desea convertir sus fechas en algún otro formato que no sea el predeterminado, puede hacer esto:

            

Aquí hay una forma más estándar de configurar esto, usando fechas ISO8601, que es lo que recomendaría para su API.

                 

Aquí hay documentación adicional:

  • Preguntas frecuentes sobre Jackson
  • Spring’s Jackson2ObjectMapperFactoryBean