如何将空数字字段绑定到 spring mvc 中的默认值 0

How to bind empty numeric field to default value 0 in spring mvc

我的 jsp 表格中有一些数字字段(但不是强制性的) 例如。 kkqty、sogoqty 和 sesaqty。 因此,当用户未在这些字段中提供任何输入时,我在控制器端收到 Null,因此在保存这些表单数据时出现空 属性 异常

我的 POJO (OutletInfo.java)

 private Double kkqty;
 private Double sogoqty;
 private Double sesaqty;

//getter & setters

@Column(name = "KKqty", nullable = false, precision = 10)
public Double getKkqty() {
    return this.kkqty;
}

public void setKkqty(Double kkqty) {
    this.kkqty = kkqty;
}

@Column(name = "sogoqty", nullable = false, precision = 10)
public Double getSogoqty() {
    return this.sogoqty;
}

public void setSogoqty(Double sogoqty) {
    this.sogoqty = sogoqty;
}

@Column(name = "sesaqty", nullable = false, precision = 10)
public Double getSesaqty() {
    return this.sesaqty;
}

我的控制器

@RequestMapping(value = "saveOutletInfo", method = RequestMethod.POST)
public @ResponseBody String saveOutletInfo(OutletInfo outletInfo,HttpServletRequest request){

    System.out.print("KKQTY:"+outletInfo.getKkqty());               
    return this.getMasterService().saveOutletInfo(outletInfo);      
}

在控制器中,当我尝试打印所有数字字段时,我在这里收到空值,因此无法保存。

我需要将 null 而不是转换为默认值 0.0 一种方法我知道我需要检查所有字段是否为 null 然后将其设置为 0.0 但这几乎是硬编码的,所以我希望在这种情况下自动转换。

我经历了一些 post 并遇到了 @InitBinder 但我无法在这种情况下使用它。

类似

的东西

@InitBinder
public void initBinder(WebDataBinder 活页夹){
binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class, true));
}

谁能建议我如何在所有数字字段为空时自动将其转换为 0.0。

你可以设置一个全局初始化绑定器,比如

@ControllerAdvice
public class GlobalBindingInitializer {

 /* global InitBinder  */

 @InitBinder
 public void binder(WebDataBinder binder) {
  binder.registerCustomEditor(Double.class, new CustomDoubleEditor());
 }
}

并注册以下编辑器

public class CustomDoubleEditor extends PropertyEditorSupport {
    public CustomDoubleEditor() {
    }

    public String getAsText() {
        Double d = (Double) getValue();
        return d.toString();
    }

    public void setAsText(String str) {
        if (str == "" || str == null)
            setValue(0);
        else
            setValue(Double.parseDouble(str));
    }
} 

然而,在您的上下文中,更合适的解决方案似乎是简单地初始化实例变量或将默认构造函数设置为值 0

private Double kkqty = 0.0;
private Double sogoqty = 0.0;
private Double sesaqty = 0.0;