2011-01-11 25 views
15

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()?

+0

Usted dijo: "Lo había usado antes sin ningún problema pero no puedo hacerlo funcionar ahora". - ¿Qué has cambiado? – Ralph

+0

Para mí, parece que si alguien elimina la lista de nodos de Tree antes de que Spring comience a poblarlo. – Ralph

+0

@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

Respuesta

15

Lo he resuelto al deshabilitar los caminos autogrownested en la carpeta, por lo que esto permite que la lista de Autopopulación se encargue del crecimiento automático con su propia fábrica.

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