2012-05-28 16 views

Respuesta

7

registrar un editor de la fecha en el controlador año:

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(LocalDate.class, new LocalDateEditor()); 
} 

y luego el propio editor de datos puede tener este aspecto:

public class LocalDateEditor extends PropertyEditorSupport{ 

@Override 
public void setAsText(String text) throws IllegalArgumentException{ 
    setValue(Joda.getLocalDateFromddMMMyyyy(text)); 
} 

@Override 
public String getAsText() throws IllegalArgumentException { 
    return Joda.getStringFromLocalDate((LocalDate) getValue()); 
} 
} 

estoy usando mi propia clase de utilidad abstracta (Joda) para el análisis fechas, de hecho, LocalDates de Joda Datetime library - recomendado como la fecha/calendario estándar de Java es una abominación, imho. Pero deberías entender la idea. Además, puede registrar un editor global, por lo que no tiene que hacerlo cada controlador (no recuerdo cómo).

+0

Gracias! eso es definitivamente mejor que mi solución. – davioooh

+0

@davioooh Spring 3.0 +?Este es un capítulo relevante. Creo que http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html "using propertyregistars" muestra cómo hacerlo globalmente. – NimChimpsky

+0

Sí, estoy usando Spring 3.1, pero todavía soy nuevo en esto ... (y Spring Framework en general ...) – davioooh

8

¡Hecho! Acabo de añadir este método a mi clase controlador:

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

Si desea dar formato a todas sus fechas sin tener que repetir el mismo código en cada controlador, puede crear un InitBinder mundial en una clase anotada con @ControllerAdvice anotación.

Pasos

1. crear una clase DateEditor que formatear fechas, así:

public class DateEditor extends PropertyEditorSupport { 

    public void setAsText(String value) { 
     try { 
     setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value)); 
     } catch(ParseException e) { 
     setValue(null); 
     } 
    } 

    public String getAsText() { 
     String s = ""; 
     if (getValue() != null) { 
     s = new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue()); 
     } 
     return s; 
    } 

2. crear una clase anotada con @ControllerAdvice (lo llamé GlobalBindingInitializer) :

@ControllerAdvice 
    public class GlobalBindingInitializer { 

    /* Initialize a global InitBinder for dates instead of cloning its code in every Controller */ 

     @InitBinder 
     public void binder(WebDataBinder binder) { 
     binder.registerCustomEditor(Date.class, new DateEditor()); 
     } 
    } 

3. En el archivo de configuración de Spring MVC (por ejemplo, webmvc-config.xml), agregue las líneas que le permiten a Spring escanear el paquete en el que creó su clase GlobalBindingInitializer. Por ejemplo, si ha creado GlobalBindingInitializer en el paquete org.example.common:

<context:component-scan base-package="org.example.common" /> 

terminado!

Fuentes:

Cuestiones relacionadas