tl; dr: У меня есть пользовательский объект, который не является коллекцией. Как я могу заставить Spring привязать его к множественному выбору?Spring MVC привязывает список, разделенный запятой, для multi-select
У меня есть объект Field
, который содержит поле под названием value
, которое является строкой, с геттерами и сеттерами. Иногда поле value
содержит одно значение, которое будет отображаться в текстовом поле. В других случаях поле value
будет содержать список, разделенный запятой, и его необходимо отобразить в окне выбора.
У меня есть карта этих полей (например, {"MY_MULTI_FIELD", Field.class}
, что я получаю следующим образом:
Текст
<form:input maxlength="200" path="fields[MY_TEXT_FIELD]" disabled="${springIsDisabled}" />
MULTISELECT
<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
поле является "тест, test2".
Как получить Spring, чтобы понять, что если значение параметра содержится в разделительной запятой, то оно должно быть выбрано?
Возможно, вам будет проще отделить ваш домен от вашего пользовательского интерфейса. Это означает создание специальных объектов, специально предназначенных для привязки к вашим формам, а затем с помощью контроллера для преобразования между объектами пользовательского интерфейса и объектами домена. – earldouglas