2011-01-11 8 views
15

początkowe pytanie (zaktualizowane poniżej)Weird problem podczas wiązania dynamicznych list

używam listę AutoPopulatingList do instatiate obiekt Wywoływanie konstruktora z niektórych parametrów. Coś jak poniższy kod. Użyłem go wcześniej bez żadnych problemów, ale teraz nie mogę go uruchomić.

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 
} 

Celem jest odwzorowany w kontrolerze jako param atrybutu modelu (@ModelAttribute Tree). Więc wysłać w wartościach formy jak:

nodes[0].field1 = some value 
nodes[1].field2 = other value 

ale kiedy wysłać te parametry sprężyna nie może instancję obiektu Node ponieważ szuka konstruktora bez params dla Node obiektu i zgłasza wyjątek jak poniżej:

org.springframework.beans.NullValueInNestedPathException: Nieprawidłowy własności „węzły” klasy fasoli [... Node]: nie można utworzyć wystąpienia typu Node nieruchomości [...], aby automatycznie rosną zagnieżdżone ścieżki nieruchomości: java.lang .InstantiationException: ... Node.()

Jeśli dodaję konstruktora bez parametrów do klasy Node, nie wystąpi błąd, ale po wysłaniu nodes[0] zostanie wywołany Node() zamiast podanego ElementFactory.

Dziwne jest to, że jeśli robię w kontrolerze treeObject.getNodes().get(0), konstruktor wywoływany jest ten z parametrami (tak jak powinien być).

Używam Spring 3.0.4.RELEASE.

Czy ktoś wie, dlaczego tak się dzieje? Czy to może być błąd?

Dzięki.


UPDATE

muszę zbudować niestandardową implementację z listy podobnej do AutoPopulatingList aby sprawdzić, czy to był problem z AutoPopulatingList, ale zdarza się to samo zachowanie. Realizacja prostu nadpisuje:

public Node get(int index) { 
    //here just creates the object it it doesn't exist in the position 
} 

Więc problem jest dlaczego kiedy zrobić w kontrolerze:

public String controllerMethod(
@ModelAttribute Tree tree, BindingResult result, Model model){ 
    ... 
} 

i wyślę węzły [0] .something jak nie ma żadnego obiektu w pozycja 0 indeksu ma na celu obiekt. Ale problem polega na wywołaniu konstruktora Node() przed wywołaniem tree.get (0). Dlaczego Spring wywołuje domyślny konstruktor? Jak zmusić go do użycia tree.get (0) do instancji obiektu zamiast Node()?

+0

Powiedziałeś: "Użyłem go wcześniej bez żadnych problemów, ale nie mogę go teraz uruchomić." - co się zmieniłeś? – Ralph

+0

Dla mnie wygląda to tak, jakby ktoś usunął listę węzłów z drzewa, zanim Spring zacznie je wypełniać. – Ralph

+0

@Ralph Zmieniono tylko wersję Spring (chociaż była to także Spring 3) i oczywiście obiekt, ponieważ użyłem go w innych projektach. Ale nie zmieniłem sposobu, w jaki go używam. – Javi

Odpowiedz

15

Rozwiązałem to przez wyłączenie autogrownestedpaths w segregatorze, więc to pozwala Autopopulacja lista zajmie się automatycznie rosnące z własnej fabryki.

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