Странная проблема при связывании динамического списка - PullRequest
15 голосов
/ 11 января 2011

НАЧАЛЬНЫЙ ВОПРОС (ОБНОВЛЕНО НИЖЕ)

Я использую список 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 ()?

1 Ответ

15 голосов
/ 17 января 2011

Я решил это, отключив autogrownestedpaths в связывателе, так что это позволяет списку автозаполнения позаботиться об автоматическом росте на своей собственной фабрике.

@InitBinder
public void initBinder(WebDataBinder binder){
    binder.setAutoGrowNestedPaths(false);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...