Formato di data JSON Spring 3.1

Sto usando il codice MVC Spring 3.1 annotato (spring-mvc) e quando invio l’object data tramite @RequestBody, la data viene mostrata come numerica. Questo è il mio controller

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

Quando passo la data, sono in grado di ricevere la data nel formato. Ma il mio browser visualizza la data come numerica

 1327682374011 

Come faccio a visualizzare la data nel formato che ho registrato per il webbinder? Ho visto in alcuni forum che dovrei usare il mappatore di jackson, ma non posso alterare il mappatore esistente?

Per sovrascrivere la strategia di formattazione della data predefinita di Jakson, segui la seguente procedura:

  1. Estendi JsonSerializer per creare una nuova class per la gestione della formattazione della data
  2. Sovrascrivi la funzione serialize(Date date, JsonGenerator gen, SerializerProvider provider) per formattare la data nel formato desiderato e scriverla nuovamente all’istanza del generatore (gen)
  3. Annota l’object getter della data per utilizzare il serializzatore json esteso usando @JsonSerialize(using = CustomDateSerializer.class)

Codice:

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

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

In alternativa, se stai utilizzando jackson e desideri una data ISO-8601 per tutte le date (non solo quelle annotate), puoi disabilitare l’impostazione predefinita di scrittura delle date come data e ora.

        WRITE_DATES_AS_TIMESTAMPS    

Quindi se vuoi convertire le tue date in un formato diverso da quello predefinito, puoi farlo:

            

Ecco un modo più standard per configurarlo, utilizzando le date ISO8601, che è ciò che consiglierei per la tua API.

                 

Ecco la documentazione aggiuntiva:

  • Domande frequenti su Jackson
  • Spring’s Jackson2ObjectMapperFactoryBean