【发布时间】:2010-09-07 21:47:53
【问题描述】:
tl;dr:我有一个不是集合的自定义对象。如何让 Spring 将其绑定到多选?
我有一个对象Field,其中包含一个名为value 的字段,它是一个带有getter 和setter 的字符串。
有时value 字段包含单个值,这些值将显示在文本框中。其他时候,value 字段将包含一个逗号分隔的列表,并且需要在多选框中显示。
我有这些字段的地图(例如{"MY_MULTI_FIELD", Field.class},我得到如下:
文字
<form:input maxlength="200" path="fields[MY_TEXT_FIELD]" disabled="${springIsDisabled}" />
多选
<form:select cssClass="required" path="fields[MY_MULTI_FIELD]" items="${blah}" size="5" multiple="true" disabled="${springIsDisabled}" />
我在控制器中注册了一个 FieldEditor
binder.registerCustomEditor(Field.class, new FieldEditor());
看起来像这样
public class FieldEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
Field field = (Field) getValue();
return field.getValue();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(text);
}
}
我只有一个文本字段的情况很好。此外,如果只选择了多选框中的一项,它也可以正常工作。
问题是当我们从多选框中选择多个项目时。当我们在保存后查看表单时,它看起来好像没有从多选中选择任何值。 getAsText() 返回逗号分隔的字符串,它当然不匹配任何一个选项值的值,而是其中几个的组合。
例如,如果我们选择
<option value="test">Test</option>
<option value="test2">Test2</option>
value 字段是“test,test2”。
我如何让 Spring 理解如果选项值包含在逗号分隔的字符串中,那么它应该被选中?
【问题讨论】:
-
您可能会发现将域与 UI 分开更容易。这意味着创建专门用于绑定到表单的特殊对象,然后使用控制器在 UI 对象和域对象之间进行转换。
标签: java spring jsp spring-mvc