2013-02-20 33 views
5

Tôi chỉ tự hỏi nếu nó có thể nói với một @InitBinder rằng giá trị float trống trong một hình thức sẽ được chuyển đổi sang 0.Xuân InitBinder: ràng buộc giá trị rỗng hoặc null của một trường phao như 0

Tôi biết rằng float là kiểu dữ liệu nguyên thủy nhưng tôi vẫn muốn chuyển đổi giá trị null hoặc rỗng thành 0.

Nếu có thể, làm cách nào tôi có thể đạt được điều đó?

Nếu không tôi sẽ chỉ làm cho một workaround sử dụng một chuỗi thay vì một phao

Trả lời

2

Có bạn luôn có thể làm điều đó .Spring có một CustomNumberEditor đó là một trình soạn thảo bất động sản tùy chỉnh cho bất kỳ Số lớp con như Integer, Long, Float , Double.It được đăng ký theo mặc định bởi BeanWrapperImpl, nhưng, có thể được ghi đè bằng cách đăng ký dụ tùy chỉnh của nó như tùy chỉnh editor.It có nghĩa là bạn có thể mở rộng một lớp như thế này

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

} 

Và sau đó đăng ký nó bình thường trong bạn điều khiển :

@InitBinder 
    public void initBinder(WebDataBinder binder) { 

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

Điều này sẽ thực hiện tác vụ.

+0

Cảm ơn, hoạt động như sự quyến rũ –

+0

Chào mừng bạn ... –

3

Xác định một subclsss của CustomNumberEditor như

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

} 

Sau đó, trong lớp điều khiển của bạn (tôi có thể tạo một BaseController cho tất cả các bộ điều khiển ứng dụng của tôi, tôi cần hành vi này cho tất cả các loại nguyên thủy số trong ứng dụng của tôi, vì vậy tôi chỉ đơn giản xác định điều này trong BaseController của tôi), đăng ký các binders cho các kiểu nguyên thủy khác nhau. Lưu ý rằng tham số hàm tạo của MyCustomNumberEditor phải là một lớp con của Number, thay vì kiểu lớp nguyên thủy.

@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)); 
....  
} 
Các vấn đề liên quan