2017-01-13 1 views
0

Это то, что на самом деле просто, но я не мог найти хороший пример:SpringMVC Checkbox: Пользовательские Binding/PropertyEditorSupport для пользовательского типа

У меня есть тип данных пользовательского который я хотел бы связываться с флажком SpringMVC, его выглядит следующим образом: ДА/НЕТ:

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

SpringMVC флажки авто-карта для Booleans, теперь мне нужно отобразить выбран> YES, пустой> 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); 
      } 

}); 

ответ

0

Я попытался определения и регистрации некоторых преобразователей (YesNoDataType/Boolean), но я вижу в CheckboxTag.java SpringMVC, что все они бесполезны , Нет конвертеры или связывающие ухищрения не будут работать, потому что тег явно проверяет Booleans и только Струны:

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

Строка привязка не имеет никакого отношения ко мне. В привязке String getValue() (раздел № 2) установлен флажок, если его атрибут value="" соответствует строке в модели. Мне нужна привязка True/False boolean, но мой конвертер необходимо подключить к разделу №1, чтобы получить логическое значение из настраиваемого типа. Просто очень разочарован тем, что весна настолько ограничительна, как только вы пытаетесь выйти за пределы узких параметров того, что является общим. Проблема все еще не решена.