pregunta inicial (ACTUALIZADO A CONTINUACIÓN)extraño problema al enlazar una lista dinámica
estoy usando una lista AutoPopulatingList
a instatiate un objeto que invoca un constructor con algunos parámetros. Algo como el código a continuación. Lo había usado antes sin ningún problema, pero no puedo hacerlo funcionar ahora.
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
}
El objeto se mapea en un controlador como un parámetro atributo modelo (@ModelAttribute Tree
). Así que enviar en los valores de la forma como:
nodes[0].field1 = some value
nodes[1].field2 = other value
Pero cuando envío de estos parámetros primavera no puede crear una instancia del objeto Node
porque está buscando un constructor sin parametros para Node
objeto, y se emite una excepción como la siguiente:
org.springframework.beans.NullValueInNestedPathException: propiedad no válido 'nodos' de clase bean [... nodo]: no se pudo crear una instancia de tipo de propiedad [... nodo] de crecimiento automático ruta de propiedad anidada: java.lang .InstantiationException: ... Node.()
Si agrego un constructor sin params a la clase Node
no hay ningún error, pero cuando envío nodes[0]
se invoca Node()
en lugar de usar el ElementFactory
provisto.
Lo extraño es que si lo hago en el controlador treeObject.getNodes().get(0)
, el constructor invocado es el que tiene params (como debería ser).
Estoy usando Spring 3.0.4.RELEASE.
¿Alguien sabe por qué puede estar pasando esto? ¿Puede ser esto un error?
Gracias.
ACTUALIZACIÓN
Tengo construir una implementación personalizada de una lista similar a AutoPopulatingList para comprobar si se trataba de un problema de AutoPopulatingList, pero sucede el mismo comportamiento. La aplicación simplemente anula:
public Node get(int index) {
//here just creates the object it it doesn't exist in the position
}
Así que el problema es por eso que cuando lo haga en un controlador:
public String controllerMethod(
@ModelAttribute Tree tree, BindingResult result, Model model){
...
}
y envío nodos [0] .something ya que no hay ningún objeto en el posición 0 del índice que tiene para instanciar el objeto. Pero el problema es que se invoca al constructor Node() antes de invocar tree.get (0). Entonces, ¿por qué Spring invoca el constructor predeterminado? ¿Cómo puedo obligarlo a usar tree.get (0) para instanciar el objeto en lugar de Node()?
Usted dijo: "Lo había usado antes sin ningún problema pero no puedo hacerlo funcionar ahora". - ¿Qué has cambiado? – Ralph
Para mí, parece que si alguien elimina la lista de nodos de Tree antes de que Spring comience a poblarlo. – Ralph
@Ralph Solo he cambiado la versión de Spring (aunque también era Spring 3) y obviamente el objeto porque lo usé en otros proyectos. Pero no he cambiado la forma en que lo uso. – Javi