Spring – Convertir parámetros de tipo fecha

noviembre 18, 2014

Supongamos que tenemos un servicio REST de la siguiente manera

    @RequestMapping(value = "/citas", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public List<Cita> buscarCitas(@RequestParam String usuario,
             @RequestParam(required = false) Date fecha){
        List<Cita> citas = null;
            if(fecha == null){
                citas = service.buscarCitas(usuario, new Date());
            }else{
                citas = service.buscarCitas(usuario, fecha);
            }
        return citas;
    }

¿cómo se supone que debemos pasar la fecha como parámetro en la URL? Spring utiliza objetos de tipo PropertyEditor, en específico los métodos getAsText y setAsText. Así que cualquier formato que acepte el constructor Date(String) debería funcionar, por ejemplo, “Sat, 12 Aug 1995 13:30:00 GMT+0430”.

Pero es mucho más fácil pasar una fecha cómo parámetro en un formato más sencillo, por ejemplo, 2014-04-28 que sería yyyy-MM-dd

Para especificar este formato en Spring, podemos utilizar Data Binding de la siguiente manera.

En nuestro @Cotnroller agregamos el siguiente método

@InitBinder
    public void initBinder(WebDataBinder binder){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

La desventaja es que tienes que utilizar el mismo formato en todos los métodos de tu servicio. Si quieres utilizar diferentes formatos tendrías que crear tu propia clase que derive de CustomEditor

Otra solución es recibir el parámetro tal como viene, String, y utilizar la clase SimpleDateFormat de la siguiente manera

@RequestMapping(value = "/citas", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public List<Cita> buscarCitas(@RequestParam String usuario, @RequestParam(required = false) String fecha) throws ParseException {
        Date fechaCitas = new SimpleDateFormat("yyyy-MM-dd").parse(fecha);
        List<Cita> citas = null;
            if(fecha == null){
                citas = service.buscarCitas(usuario, new Date());
            }else{
                citas = service.buscarCitas(usuario, fechaCitas);
            }

        return citas;
    }

Fuentes:
http://spring.io/blog/2009/03/08/rest-in-spring-3-mvc/
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html
http://www.intertech.com/Blog/spring-frameworks-webdatabinder/
http://forum.spring.io/forum/spring-projects/web/3003-two-customdateeditor-one-for-date-and-other-for-time

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: