НАЧАЛЬНЫЙ ВОПРОС (ОБНОВЛЕНО НИЖЕ)
Я использую список AutoPopulatingList
для создания объекта, вызывающего конструктор с некоторыми параметрами. Что-то вроде кода ниже. Я использовал его раньше без проблем, но сейчас не могу заставить его работать.
public class Tree {
...
private List<Node> nodes = new AutoPopulatingList<Node>(new ElementFactory<Node>() {
@Override
public Node createElement(final int index) throws ElementInstantiationException {
//call custom controller
return new Node(index, ...other params);
}
});
...
//getters & setters
}
Объект отображается в контроллере как параметр атрибута модели (@ModelAttribute Tree
). Поэтому я отправляю в форме значения вроде:
nodes[0].field1 = some value
nodes[1].field2 = other value
Но когда я отправляю эти параметры, Spring не может создать экземпляр объекта Node
, потому что он ищет конструктор без параметров для Node
объекта и выдает исключение, подобное следующему:
org.springframework.beans.NullValueInNestedPathException: недопустимые свойства 'узлов' класса бина [... Node]: не удалось создать экземпляр типа свойства [... Node] для автоматического увеличения пути вложенного свойства: java.lang.InstantiationException : ... Узел. ()
Если я добавляю конструктор без параметров в класс Node
, ошибки не возникает, но при отправке nodes[0]
он вызывается Node()
вместо использования предоставленного ElementFactory
.
Странная вещь заключается в том, что если я это сделаю в контроллере treeObject.getNodes().get(0)
, то вызывается конструктор с параметрами (как и должно быть).
Я использую Spring 3.0.4.RELEASE.
Кто-нибудь знает, почему это может происходить? Может ли это быть ошибкой?
Спасибо.
UPDATE
Я создал пользовательскую реализацию List, аналогичную AutoPopulationList, чтобы проверить, не является ли это проблемой AutoPopulationList, но происходит то же поведение.
Реализация просто переопределяет:
public Node get(int index) {
//here just creates the object it it doesn't exist in the position
}
Так вот проблема, почему, когда я делаю в контроллере:
public String controllerMethod(
@ModelAttribute Tree tree, BindingResult result, Model model){
...
}
и я отправляю узлы [0]. Что-то, поскольку в позиции 0 индекса нет объекта, который должен иметь экземпляр объекта. Но проблема в том, что он вызывается конструктором Node () перед вызовом tree.get (0). Итак, почему Spring вызывает конструктор по умолчанию? Как я могу заставить его использовать tree.get (0) для экземпляра объекта вместо Node ()?