Jav*_*avi 15 java collections spring constructor spring-mvc
初步问题(更新如下)
我正在使用一个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
}
Run Code Online (Sandbox Code Playgroud)
该对象在控制器中映射为模型属性param(@ModelAttribute Tree).所以我发送的表单值如下:
nodes[0].field1 = some value
nodes[1].field2 = other value
Run Code Online (Sandbox Code Playgroud)
但是当我发送这些参数时,spring无法实例化Node对象,因为它正在查找没有params for Nodeobject 的构造函数,并且它会抛出一个Exception,如下所示:
org.springframework.beans.NullValueInNestedPathException:bean类[... Node]的属性'nodes'无效:无法实例化属性类型[... Node]以自动增长嵌套属性路径:java.lang.InstantiationException:.. .节点.()
如果我将没有params的构造函数添加到Node类中,则没有错误,但是当我发送nodes[0]它时,调用它Node()而不是使用ElementFactory提供的.
奇怪的是,如果我在控制器中执行treeObject.getNodes().get(0),则调用的构造函数是具有params的构造函数(应该是).
我正在使用Spring 3.0.4.RELEASE.
有人知道为什么会这样吗?这可能是个错误吗?
谢谢.
UPDATE
我已经构建了类似于AutoPopulatingList的List的自定义实现,以检查这是否是AutoPopulatingList的问题,但它发生了相同的行为.实现只是覆盖:
public Node get(int index) {
//here just creates the object it it doesn't exist in the position
}
Run Code Online (Sandbox Code Playgroud)
所以问题是为什么当我在控制器中做的时候:
public String controllerMethod(
@ModelAttribute Tree tree, BindingResult result, Model model){
...
}
Run Code Online (Sandbox Code Playgroud)
我发送节点[0] .something,因为索引的位置0中没有任何对象,它必须实例化对象.但问题是它在调用tree.get(0)之前调用了Node()构造函数.那么,为什么Spring会调用默认的构造函数呢?如何强制它使用tree.get(0)来实例化对象而不是Node()?
Jav*_*avi 15
我已经通过禁用活页夹中的自动增长路径来解决它,因此这允许自动填充列表将负责自己的工厂自动增长.
@InitBinder
public void initBinder(WebDataBinder binder){
binder.setAutoGrowNestedPaths(false);
}
Run Code Online (Sandbox Code Playgroud)