Связывание данных вложенной формы со списками объектов в Spring MVC - PullRequest
2 голосов
/ 22 апреля 2010

У меня есть такой объект:

public class FormFields extends BaseObject implements Serializable {

private FieldType fieldType; //checkbox, text, radio
private List<FieldValue> value; //FieldValue contains simple string/int information, id, value, label

//other properties and getter/setters


}

Я перебираю список FormFields и, если fieldType не равен переключателю, я выводю список значений полей в JSP, используя

 <c:forEach items=${formField.value}></c:forEach>

что все хорошо и отлично работает.

Помимо этого у меня есть проверка, является ли fieldType радио, в котором я использую:

<form:radiobuttons path="formFields[${formFieldRow.index}].value" items="${formField.value}" itemLabel="label" cssClass="radio"/>

Однако это вызывает у меня проблемы, когда я получаю такие ошибки:

 Failed to convert property value of type [java.lang.String] to required type [java.util.List] for property formFields[11].value; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [com.example.model.FieldValue] for property value[0]: no matching editors or conversion strategy found

Я гуглил это и искал переполнение стека и нашел ссылки на registerCustomEditor и подобные функции, но я не уверен, как правильно решить эту проблему.

Является ли редактор пользовательских свойств подходом к этому? Если так, как это будет работать?

1 Ответ

2 голосов
/ 30 апреля 2010

Я думаю, вы правы в чем проблема. Когда вы делаете path = "formFields [$ {formFieldRow.index}]. Value", вы возвращаете значение String из каждой радиокнопки формы, и Spring должен знать, как преобразовать это значение String в каждый объект FieldValue для заполнения значения List. .

Итак, вам нужно создать свой customEditor и связать этот редактор в initbinder с классом List:

@InitBinder
public void initBinder(final WebDataBinder binder) {
    binder.registerCustomEditor(FieldValue.class, CustomEditor() ));
}

и ваш класс CustomEditor должен расширять PropertyEditorSupport следующим образом:

public class CustomEditor extends PropertyEditorSupport{  
    public void setAsText(String text) {
        FieldValue field;
        //you have to create a FieldValue object from the string text 
        //which is the one which comes from the form
        //and then setting the value with setValue() method
        setValue(field);
    }
} 
...