2010-09-07 3 views
2

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, чтобы понять, что если значение параметра содержится в разделительной запятой, то оно должно быть выбрано?

+1

Возможно, вам будет проще отделить ваш домен от вашего пользовательского интерфейса. Это означает создание специальных объектов, специально предназначенных для привязки к вашим формам, а затем с помощью контроллера для преобразования между объектами пользовательского интерфейса и объектами домена. – earldouglas

ответ

1

Я не думаю, что объект модели Field имеет правильную структуру для множественного выбора.

+0

Да, я знаю, если путь для выбора - это Set, то он будет привязываться соответствующим образом, но я бы предпочел не передавать Set или String в качестве формы: select (или form: input) путь, а скорее передать весь объект и используйте редактор свойств, чтобы сообщить Spring, как привязать мой объект соответствующим образом. – Josh

Смежные вопросы