Пытался найти ответ в Интернете, но не смог.Должно быть просто для профессиональных разработчиков Spring ... так что вот оно:
В двух словах я хочу связать список типа интерфейса: список с формой и получить данные обратно (возможно, изменены пользователем через формуПроблема в том, что он не работает: (
мой код (короткая версия) - класс команды / модели, который передается в форму:
public class RoomsFormSearchResultCommand extends RoomsFormSearchCommand {
@SuppressWarnings("unchecked")
private List<IRoom> roomsList = LazyList.decorate(new ArrayList<Room>(),
FactoryUtils.instantiateFactory(Room.class));
public List<IRoom> getRoomsList() {
return roomsList;
}
public void setRoomsList(final List<IRoom> roomsList) {
this.roomsList = roomsList;
}
(...)
, затем в форме Iиспользуйте это так (короткая версия):
<form:form method="post" action="reserve" commandName="roomsResultsCmd">
(...)
<c:forEach var="room" items="${roomsResultsCmd.roomsList}"
varStatus="status">
<tr>
<td><form:input path="roomsList[${status.index}].roomNumber" readonly="true"/>
(...)
Форма отображается нормально, но после отправки я получаю:
2012-01-22 21:31:55 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [wyspa] in context with path [/wyspa] threw exception [Request processing failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'roomsList[0]' of bean class [com.wyspa.controller.command.RoomsFormSearchResultCommand]: Illegal attempt to get property 'roomsList' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'roomsList' of bean class [com.wyspa.controller.command.RoomsFormSearchResultCommand]: Could not instantiate property type [com.wyspa.entity.IRoom] to auto-grow nested property path: java.lang.InstantiationException: com.wyspa.entity.IRoom] with root cause
org.springframework.beans.NullValueInNestedPathException: Invalid property 'roomsList' of bean class [com.wyspa.controller.command.RoomsFormSearchResultCommand]: Could not instantiate property type [com.wyspa.entity.IRoom] to auto-grow nested property path: java.lang.InstantiationException: com.wyspa.entity.IRoom
at org.springframework.beans.BeanWrapperImpl.newValue(BeanWrapperImpl.java:633)
at org.springframework.beans.BeanWrapperImpl.growCollectionIfNecessary(BeanWrapperImpl.java:863)
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:770)
at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:555)
(...)
Дело в том, что когда я изменяю список на список «экземпляров», все работает отлично!
public class RoomsFormSearchResultCommand extends RoomsFormSearchCommand {
@SuppressWarnings("unchecked")
//notice that the List is now List<Room>
private List<Room> roomsList = LazyList.decorate(new ArrayList<Room>(),
FactoryUtils.instantiateFactory(Room.class));
В этом случае данные передаются в контроллер надлежащим образом.
Поскольку я привык использовать интерфейсы, и мне это безумно нравится, я бы ДЕЙСТВИТЕЛЬНО предпочел не переводить List<IRoom>
(который возвращается из сервисов) в List<Room>
, который, кажется, подходит для Spring. Возможно ли работатьс List<IRoom>
в этом случае или Spring просто не поддерживает его?
// КонечноКомната реализует IRoom - но я думаю, вы уже получили это ...
Я был бы ОЧЕНЬ рад за любую помощь / предложения!
С наилучшими пожеланиями, Nirwan