2013-02-20 3 views
5

Я просто интересно, если это можно сказать об @InitBinder, что пустые значения с плавающей точкой в ​​виде будут преобразованы в 0.Spring InitBinder: связать пустые или нулевые значения поля флоат 0

Я знаю, что float - примитивный тип данных, но я все равно хотел бы преобразовать нулевые или пустые значения в 0.

Если это возможно, как я могу это достичь?

В противном случае я просто сделать обходной путь, используя строку вместо поплавка

ответ

2

Да, вы всегда можете сделать это .Spring есть CustomNumberEditor, который является настраиваемым редактором свойств для любого числа подкласса, как Integer, Long, Float , Double.It зарегистрирован по умолчанию, BeanWrapperImpl, но, может быть преодолена регистрирующим пользовательским экземпляром это как обычай editor.It означает, что вы можете расширить класс, как этого

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

} 

а затем зарегистрировать его обычно в вас контроллере :

@InitBinder 
    public void initBinder(WebDataBinder binder) { 

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

Это должно выполнить задачу.

+0

Спасибо, работает как шарм –

+0

Ваш прием ... –

3

Определение subclsss из CustomNumberEditor в

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

} 

Тогда в классе контроллера (создать BaseController для всех моих контроллеров приложений, мне нужно это поведение для всех числовых типов примитивов в моем приложении, так что я просто определите это в моем BaseController), зарегистрируйте связующие для различных примитивных типов. Обратите внимание, что параметр конструктора MyCustomNumberEditor должен быть подклассом Number, а не примитивным типом класса.

@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)); 
....  
} 
Смежные вопросы