2015-02-02 4 views
2

Я использую auto-binding функцию для поля skills (список Array) в моем View:Spring MVC ArrayList автоматическое связывание Превращается в массив строк

... 
     <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 

Почему весна ожидалась array of String вместо String arraylist в то время как skills тип является String arraylist?

+1

Используйте 'list' вместо' ArrayList' вы должны быть программирование интерфейсов, а не конкретные классами. –

+0

вы также можете опубликовать конфигурацию сервлета, кажется, что некоторые из преобразователей по умолчанию не зарегистрированы, вы настроили настраиваемую службу преобразования –

ответ

1

При отправке формы с несколькими вариантами выбора, Spring parses the parameters in an array of Strings.

Давайте подробнее рассмотрим ваше сообщение об ошибке.

Линия 1:

Не удалось преобразовать значение свойства типа java.lang.String [] для требуемого типа java.util.ArrayList для навыков собственности;

Spring разбирает String[] из параметров URL и делает:

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, который описывает, как это сделать.

+0

все верно, но дело в том, что с 3,0 весны MVC отправляет ArrayToCollectionConverter, который обрабатывает корпус OP. Запутанный бит - это то, почему этот конвертер не пинает –

+0

Можете ли вы опубликовать ссылку на какую-то документацию, описывающую, как работает этот класс?Все, что я могу найти, это [ArrayToCollection] (http://docs.spring.io/spring-webflow/docs/2.4.0.RELEASE/api/org/springframework/binding/convert/converters/ArrayToCollection.html), но это в Spring Web Flow. – t0mppa

+0

Я говорил от верхушки головы, так что пропущен, его [ArrayToCollectionConverter] (https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org /springframework/core/convert/support/ArrayToCollectionConverter.java) ваш пост исправил проблему, поэтому проголосовать за ее счет, но я бы ожидал, что это преобразование встроено –

0

добавить mvc:annotation-driven имен в xxxx-dispatcher-servlet.xml

+1

Можете ли вы добавить пример добавления в 'xxxx -dispatcher-servlet.xml', который должен выполнить OP, чтобы исправить проблему? –

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