2012-05-28 11 views

Odpowiedz

7

zarejestrować datę edytor w kontrolerze yr:

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

a następnie redaktor Dane sama może wyglądać następująco:

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

używam moje własne klasy abstrakcyjne użytkową (Joda) do parsowania daty, w rzeczywistości LocalDates od Joda Datetime library - zalecane jako standardowa data/kalendarz java jest obrzydliwością, imho. Ale powinieneś dostać ten pomysł. Możesz także zarejestrować edytor globalny, więc nie musisz tego robić z każdym kontrolerem (nie pamiętam jak).

+0

Dziękujemy! to zdecydowanie lepsze niż moje rozwiązanie. – davioooh

+0

@ Daavioooh Spring 3.0 +?Oto odpowiedni rozdział: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html "using propertyregistars" pokazuje, jak to zrobić globalnie – NimChimpsky

+0

Tak, używam Springa 3.1, ale wciąż jestem dla niego nowy ... (i do Spring Framework w ogóle ...) – davioooh

8

Gotowe! Właśnie dodałem tę metodę do mojej klasy kontrolera:

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

Jeśli chcesz sformatować wszystkie dat bez konieczności powtarzania tego samego kodu w każdym kontrolerze, można utworzyć globalnego InitBinder w klasie, z dopiskiem @ControllerAdvice adnotacja.

Kroki

1. Utwórz klasę DateEditor że sformatuje dat, tak:

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. Utwórz klasę uwagami z @ControllerAdvice (nazwałem go 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. W pliku konfiguracyjnym Spring MVC (na przykład webmvc-config.xml) dodaj linie, które umożliwiają Springowi zeskanowanie pakietu, w którym utworzyłeś swoją klasę GlobalBindingInitializer. Na przykład, jeżeli utworzono GlobalBindingInitializer w pakiecie org.example.common:

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

Zakończone!

Źródła:

Powiązane problemy