我有一个像这样的对象:
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
我已经用Google搜索并搜索了Stack Overflow,并找到了对registerCustomEditor和类似函数的引用,但我不确定如何正确解决这个问题。
自定义属性编辑器是否可以使用此方法?如果是这样,它将如何运作?
答案 0 :(得分:2)
我认为你的问题是对的。当你执行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);
}
}