2012-05-28 23 views

cevap

7

yıl denetleyicisi bir tarih editörü kayıt:

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

ve sonra veri editörü kendisi şöyle olabilir:

Ben ayrıştırma için kendi soyut yardımcı sınıf (Joda) kullanıyorum
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()); 
} 
} 

tarihler, aslında Joda Datetime library dan LocalDates - standart java tarih/takvim olarak önerilen bir iğrenç, imho. Ama fikri almalısın. Ayrıca, global bir editöre kayıt olabilirsiniz, böylece her bir kontrol cihazını (bunu nasıl hatırlayamıyorum) yapmanıza gerek yok.

+0

teşekkür ederiz! Bu kesinlikle benim çözümümden daha iyi. – davioooh

+0

@davioooh Spring 3.0 +?Bu konuyla ilgili bölüm http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html "propertyregistars kullanarak" global olarak nasıl yapılacağını gösterir – NimChimpsky

+0

Evet, Spring kullanıyorum 3.1, ama yine de yeni ... (ve genel olarak Spring Framework için ...) – davioooh

8

Bitti! Her Kontrolör aynı kodu tekrar etmek zorunda kalmadan tüm tarihleri ​​biçimlendirmek istiyorsanız

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

, sen @ControllerAdvice ile açıklamalı bir sınıfta bir küresel InitBinder oluşturabilirsiniz: Sadece benim denetleyicisi sınıfına bu yöntemi eklendi Ek açıklama.

Adımlar

1. böyle, senin tarihleri ​​biçimlendirir bir DateEditor sınıf oluşturun:

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. @ControllerAdvice ile açıklamalı bir sınıf oluşturun (ı GlobalBindingInitializer denir) :

@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. Spring MVC yapılandırma dosyanızda (örneğin webmvc-config.xml), Spring'in GlobalBindingInitializer sınıfınızı oluşturduğunuz paketi taramasına izin veren satırları ekleyin. Örneğin, eğer org.example.common paketinde GlobalBindingInitializer oluşturuldu:

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

bitirdi!

Kaynaklar:

İlgili konular