Spring mvc arraylist自动绑定转换为字符串数组

时间:2015-02-02 12:54:29

标签: java spring

我在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 arraylistskills类型为String arraylist

2 个答案:

答案 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名称空间