【问题标题】:How to bind empty numeric field to default value 0 in spring mvc如何在spring mvc中将空数字字段绑定到默认值0
【发布时间】:2015-04-11 18:10:25
【问题描述】:

我的 jsp 表单中有一些数字字段(但不是强制性的) 例如。 kkqty、sogoqty 和 sesaqty。 因此,当用户未在这些字段中提供任何输入时,我会在控制器端接收 Null,因此在保存这些表单数据时会出现 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,因此无法保存。

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

我浏览了一些帖子并遇到了@InitBinder,但在这种情况下我无法使用它。

有点像

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

任何人都可以建议我如何在我的所有数字字段为空时自动将其转换为 0.0。

【问题讨论】:

    标签: java spring jsp spring-mvc model-view-controller


    【解决方案1】:

    你可以设置一个全局的 init-binder,比如

    @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;
    

    【讨论】:

    • 我尝试像这样初始化,但我仍然为空。
    • 但是您建议使用@InitBinder 效果很好......非常感谢。 :) :)
    • 如何转换收藏夹?
    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 2018-11-24
    • 1970-01-01
    • 2013-03-12
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多