2011-01-11 2 views
15

НАЧАЛЬНОГО ВОПРОСА (ОБНОВЛЕН НИЖЕ)Weird проблемы при связывании динамического списка

Я использую AutoPopulatingList список instatiate объекта вызывающего конструктор с некоторыми параметрами. Что-то вроде кода ниже. Я использовал его без проблем, но сейчас я не могу заставить его работать.

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 

Но когда я посылаю эти параметры пружина не может создать экземпляр Node объекта, поскольку он ищет конструктора без Params для Node объекта, и он бросает исключение, как следующее:

org.springframework.beans.NullValueInNestedPathException: Invalid свойство 'узлы' класса боба [... Node]: не удалось создать экземпляр тип недвижимости [... Node] для автоматического увеличения вложенного пути свойства: java.lang .InstantiationException: ... Узел.()

Если я добавлю конструктор без параметров в класс Node, нет ошибки, но когда я отправляю nodes[0], он вызывается Node() вместо того, чтобы использовать ElementFactory.

Странно, что если я делаю в контроллере treeObject.getNodes().get(0), вызываемый конструктор - это тот, у кого есть параметры (как и должно быть).

Я использую Spring 3.0.4.RELEASE.

Кто-нибудь знает, почему это может произойти? Это может быть ошибка?

Спасибо.


UPDATE

У меня есть создать собственную реализацию списка аналогично AutoPopulatingList, чтобы проверить, была ли это проблема AutoPopulatingList, но это происходит такое же поведение. Реализация просто переопределяет:

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] .something как нет какой-либо объект в позиции 0 индекса, он должен иметь экземпляр объекта. Но проблема в том, что он вызывает конструктор Node() перед вызовом tree.get (0). Итак, почему Spring вызывает конструктор по умолчанию? Как заставить его использовать tree.get (0) для экземпляра объекта вместо Node()?

+0

Вы сказали: «Я использовал это без проблем, но я не могу заставить его работать сейчас». - Что ты изменил? – Ralph

+0

Для меня это похоже, если кто-то удаляет список узлов из Дерева, прежде чем Spring начнет его заполнять. – Ralph

+0

@Ralph Я только изменил версию Spring (хотя это была и Spring 3) и, очевидно, объект, потому что я использовал его в других проектах. Но я не изменил способ использования. – Javi

ответ

15

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

@InitBinder 
public void initBinder(WebDataBinder binder){ 
    binder.setAutoGrowNestedPaths(false); 
} 
Смежные вопросы