【问题标题】:Spring MVC bind comma separated list to multi-selectSpring MVC 将逗号分隔列表绑定到多选
【发布时间】: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


【解决方案1】:

我不认为模型对象Field 具有适合多选的结构。

【讨论】:

  • 是的,我知道如果选择的路径是一个集合,那么它将适当地绑定,但我不希望将集合或字符串作为表单传递:选择(或表单:输入)路径,而是传递整个对象并使用属性编辑器告诉 Spring 如何正确绑定我的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多