Командные объекты в Spring
-
07-07-2019 - |
Вопрос
У меня есть командный объект, состоящий из примитивных полей и поля объекта.Как мне привязать поля моей формы к полям объекта?
Я пытался это сделать, но безрезультатно
<form:form commandName="course" method="POST">
<form:input path="activity.activity"/>
.
.
.
</form:form>
Я получаю эту ошибку
org.springframework.beans.NotReadablePropertyException:
Invalid property 'course' of bean class
Мой командный класс выглядит следующим образом
public class Course {
private long id;
private String owner;
private String title;
private List<LearningActivity> activity = new ArrayList<LearningActivity>();
//getters and setters
}
public class LearningActivity {
private long ID;
private String activity;
private String link;
//getters and setters
}
Решение
Ваш список должен быть предварительно заполнен таким количеством объектов LearningActivity, на которое вы планируете ссылаться (используя активность [0], действие [1] и т. д.), или это должен быть отложенный список. Ленивый список - это список, который будет заполняться пустыми объектами при ссылке на данный индекс.
Комментарий указывает на то, что вы пытаетесь использовать Apache Commons LazyList, который должен работать - вам не хватает директивы импорта? Однако в качестве альтернативы есть реализация списка отложенных ссылок Spring, которая называется AutoPopulationList.
Другие советы
Здесь возможны две проблемы:
activity.activity
недопустимо (если только ваши геттеры не соответствуют вашим переменным-членам), потому чтоCourse.activity
это список.Вам нужно обратиться к определенному элементу списка - напримерactivity[0].activity
.Вам также нужно будет убедиться, что он действительно существует.Правильно ли вы настроили свой FormController?Проходит ли это
Course
экземпляр для просмотра как следует?Взгляните на Учебное пособие по Spring MVC для примера.
Если после того, как вы исправили # 1 и убедились, что # 2 выполнено правильно, ошибка не исчезает, пожалуйста, опубликуйте более подробную информацию (FormController mapping / source).