绑定动态列表时出现奇怪问题

初始问题(在下面更新)

我正在使用列表来初始化一个对象,该对象调用具有一些参数的构造函数。类似于下面的代码。我以前用过它,没有任何问题,但我现在无法让它工作。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无法实例化对象,因为它正在寻找一个没有对象参数的构造函数,并且它会抛出如下所示的异常:NodeNode

org.springframework.beans.NullValueInNestedPathException: Bean class 的 Invalid property 'nodes' [...节点]:无法实例化属性类型 [...Node] 以自动增长嵌套属性路径:java.lang.InstantiationException: ...节点。()

如果我向类中添加一个没有参数的构造函数,则不会有错误,但是当我发送它时,它将被调用而不是使用提供的。Nodenodes[0]Node()ElementFactory

奇怪的是,如果我在控制器中这样做,调用的构造函数是带有参数的构造函数(应该如此)。treeObject.getNodes().get(0)

我使用的是Spring 3.0.4.RELEASE。

有谁知道为什么会发生这种情况?这可能是一个错误吗?

谢谢。


更新

我已经构建了一个类似于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],因为在索引的位置0中没有任何对象,它必须实例化对象。但问题是,在调用 tree.get(0) 之前,它被调用了 Node() 构造函数。那么,为什么Spring会调用默认构造函数呢?如何强制它使用 tree.get(0) 来实例化对象而不是 Node()?


答案 1

我已经通过禁用绑定器中的自动增长路径解决了这个问题,因此这允许自动填充列表将使用自己的工厂来处理自动增长。

@InitBinder
public void initBinder(WebDataBinder binder){
    binder.setAutoGrowNestedPaths(false);
}

答案 2