2013-02-20 7 views
5

Zastanawiam się, czy to możliwe, aby powiedzieć, że jest @InitBinder pustych wartości pływaka w formularzu zostaną przekształcone na 0.Wiosna InitBinder: wiążą pustych lub zerowe wartości pola pływaka jako 0

wiem, że float to prymitywny typ danych, ale nadal chciałbym przekonwertować wartości puste lub puste na 0.

Jeśli to możliwe, jak mogę to osiągnąć?

przeciwnym razie będę tylko zrobić obejście przy użyciu String zamiast pływaka

Odpowiedz

2

Tak zawsze można zrobić .Spring mają CustomNumberEditor który jest konfigurowalny edytor nieruchomość dla dowolnej liczby podklasy jak Integer, Long, Float , Double.It zarejestrowana jest domyślnie przez BeanWrapperImpl, ale może być przesłonięta przez rejestrującego niestandardowych instancji nim jako zwyczaj editor.It oznacza można rozszerzyć klasę jak ten

public class MyCustomNumberEditor extends CustomNumberEditor{ 

    public MyCustomNumberEditor(Class<? extends Number> numberClass, NumberFormat numberFormat, boolean allowEmpty) throws IllegalArgumentException { 
     super(numberClass, numberFormat, allowEmpty); 
    } 

    public MyCustomNumberEditor(Class<? extends Number> numberClass, boolean allowEmpty) throws IllegalArgumentException { 
     super(numberClass, allowEmpty); 
    } 

    @Override 
    public String getAsText() { 
     //return super.getAsText(); 
     return "Your desired text"; 
    } 

    @Override 
    public void setAsText(String text) throws IllegalArgumentException { 
     super.setAsText("set your desired text"); 
    } 

} 

a następnie zarejestrować go normalnie w was kontrolera :

@InitBinder 
    public void initBinder(WebDataBinder binder) { 

     binder.registerCustomEditor(Float.class,new MyCustomNumberEditor(Float.class, true)); 
    } 

To powinno wykonać zadanie.

+0

Dzięki, działa jak urok –

+0

Twoje powitanie ... –

3

Zdefiniuj subclsss z CustomNumberEditor jak

import org.springframework.beans.propertyeditors.CustomNumberEditor; 
import org.springframework.util.StringUtils; 

public class MyCustomNumberEditor extends CustomNumberEditor { 

    public MyCustomNumberEditor(Class<? extends Number> numberClass) throws IllegalArgumentException { 
     super(numberClass, true); 
    } 

    @Override 
    public void setAsText(String text) throws IllegalArgumentException { 
     if (!StringUtils.hasText(text)) { 
      setValue(0); 
     }else { 
      super.setAsText(text.trim()); 
     } 
    } 

} 

potem w swojej klasie kontrolera (tworzę BaseController dla wszystkich moich kontrolerów aplikacyjnych, muszę to zachowanie dla wszystkich numerycznych prymitywnych typów w mojej aplikacji, więc po prostu zdefiniuj to w moim BaseController), zarejestruj segregatory dla różnych typów pierwotnych. Należy zauważyć, że parametr konstruktora obiektu MyCustomNumberEditor musi być podklasą obiektu Number, a nie typem klasy podstawowej.

@InitBinder 
public void registerCustomerBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(double.class, new MyCustomNumberEditor(Double.class)); 
    binder.registerCustomEditor(float.class, new MyCustomNumberEditor(Float.class)); 
    binder.registerCustomEditor(long.class, new MyCustomNumberEditor(Long.class)); 
    binder.registerCustomEditor(int.class, new MyCustomNumberEditor(Integer.class)); 
....  
}