我在auto-binding
中的字段skills
(数组列表)中使用View
功能:
...
<p>
Student's Skills <select name="skills" multiple>
<option value="Java Core"> Java Core </option>
<option value="Spring Core"> Spring Core </option>
<option value="Spring MVC"> Spring MVC </option>
</select>
</p>
(Action is for ` "/MySpringMVCProject3/submitAddmission.html" method="post" `)
...
这是我的模特课:
public class Student {
...//name, age fields
private ArrayList<String> skills;
public ArrayList<String> getSkills() {
return skills;
}
public void setSkills(ArrayList<String> skils) {
this.skills = skils;
}
//other getter/setters
}
这是我的控制者:
@Controller
public class AdmissionController {
@RequestMapping(value = "/submitAddmission.html", method = RequestMethod.POST)
public ModelAndView submitAdmissionForm(@ModelAttribute("st1") Student student1, BindingResult result) {
if (result.hasErrors()) {
ModelAndView model = new ModelAndView("AdmissionForm");
return model;
}
ModelAndView model2 = new ModelAndView("AdmissionSuccess");
return model2;
}
}
但是当我点击提交按钮时,会出现binding result error
:
Failed to convert property value of type java.lang.String[] to required type java.util.ArrayList for property skills; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String[]] to required type [java.util.ArrayList] for property skills: no matching editors or conversion strategy found
为什么Spring期望array of String
代替String arraylist
而skills
类型为String arraylist
?
答案 0 :(得分:1)
当您发布带有多个选择选项的表单时,Spring parses the parameters in an array of Strings
。
让我们仔细看看您的错误消息。
第1行:
无法将java.lang.String []类型的属性值转换为属性技能所需的java.util.ArrayList类型;
Spring从URL参数解析String[]
并执行:
String[] input = { "foo", "bar" };
ArrayList<String> skills = (ArrayList<String>) input;
显然会失败,因为Java不会自动知道如何对其进行类型转换。但是,内置了一些简单的转化,例如String[]
到List<String>
,如here所示。
第2行:
嵌套异常是java.lang.IllegalStateException:无法将类型[java.lang.String []]的值转换为属性技能所需的类型[java.util.ArrayList]:找不到匹配的编辑器或转换策略
如果你定义了一个合适的转换策略,你可以教Spring将任何东西转换成任何东西。这可以通过构建一个Converter
类来自动将A转换为B然后教Spring来使用它。 Here's another answer,概述了如何做到这一点。
答案 1 :(得分:0)
在mvc:annotation-driven
xxxx-dispatcher-servlet.xml
名称空间