【问题标题】:SpringMVC Checkbox: Custom Binding / PropertyEditorSupport for Custom TypeSpringMVC 复选框:自定义类型的自定义绑定/PropertyEditorSupport
【发布时间】:2017-01-13 20:01:22
【问题描述】:

这很简单,但我找不到一个很好的例子:

我有一个想要绑定到 SpringMVC 复选框的自定义数据类型,它看起来像这样:YES/NO:

public enum YesNoDataType {
   YES("Yes"), 
   NO("No");
}

SpringMVC 复选框自动映射到布尔值,现在我需要映射 Selected->YES, Empty->NO。

我知道我必须实现这 4 种 PropertyEditorSupport 方法之一,但是哪些方法以及如何实现?

<form:checkbox path="testYesNo"></form:checkbox>

型号

private YesNoDataType testYesNo; 

控制器

binder.registerCustomEditor(YesNoDataType.class, new PropertyEditorSupport() {

          // Which ones to override?

            @Override
            public void setValue(Object value) {
                // TODO Auto-generated method stub
                super.setValue(value);
            }

            @Override
            public Object getValue() {
                // TODO Auto-generated method stub
                return super.getValue();
            }

            @Override
            public String getAsText() {
                // TODO Auto-generated method stub
                return super.getAsText();
            }

            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                // TODO Auto-generated method stub
                super.setAsText(text);
            }

});

【问题讨论】:

    标签: spring spring-mvc checkbox


    【解决方案1】:

    我尝试定义和注册一些转换器(YesNoDataType / Boolean),但我在 SpringMVC 的 CheckboxTag.java 中看到它们都是无用的。没有转换器或绑定调整将起作用,因为该标记仅显式检查 布尔值和字符串

    protected void writeTagDetails(TagWriter tagWriter) throws JspException {
        tagWriter.writeAttribute("type", getInputType());
    
        Object boundValue = getBoundValue();
        Class<?> valueType = getBindStatus().getValueType();
    
        if (Boolean.class.equals(valueType) || boolean.class.equals(valueType)) {
            // the concrete type may not be a Boolean - can be String
            if (boundValue instanceof String) {
                boundValue = Boolean.valueOf((String) boundValue);
            }
            Boolean booleanValue = (boundValue != null ? (Boolean) boundValue : Boolean.FALSE);
            renderFromBoolean(booleanValue, tagWriter);
        }
    
        else {
            Object value = getValue();
            if (value == null) {
                throw new IllegalArgumentException("Attribute 'value' is required when binding to non-boolean values");
            }
            Object resolvedValue = (value instanceof String ? evaluate("value", value) : value);
            renderFromValue(resolvedValue, tagWriter);
        }
    }
    

    字符串绑定与我无关。在 getValue() 字符串绑定(第 2 条)中,如果复选框的 value="" 属性与模型中的字符串匹配,则选中复选框。我需要的是一个 True/False 布尔绑定,但我的 Converter 需要插入到 Clause #1 中才能从自定义类型中获取布尔值。非常沮丧的是,一旦您尝试超出常见的狭窄参数,Spring 就会如此严格。这个问题仍然悬而未决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2012-12-14
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多