2011-01-11 9 views
15

INITIAL 질문이상한 문제 동적리스트를 (아래 업데이트)

I 몇몇 파라미터와 생성자 호출 객체를 인스턴스화 할 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 
} 

객체는 모델 속성 PARAM (@ModelAttribute Tree)와 같은 컨트롤러에 매핑된다. 이 Node 개체에 대한 PARAMS가없는 생성자를 찾고 있기 때문에

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

하지만 이러한 매개 변수를 보낼 때 스프링이 Node 개체를 인스턴스화 할 수 있으며, 다음과 같은 예외가 발생합니다 : 그래서 내가 좋아하는 형태로 값을 보내

org.springframework.beans.NullValueInNestedPathException : bean 클래스의 노드 'Node ...'이 (가) 잘못되었습니다. [... Node] : 중첩 된 속성 경로를 자동 확장하도록 속성 유형 [... Node]을 (를) 인스턴스화 할 수 없습니다. java.lang .InstantiationException : ... Node.()

Node 클래스에 params가없는 생성자를 추가하면 nodes[0]을 보낼 때 ElementFactory 대신 Node()이 전송됩니다.

이상한 점은 컨트롤러 treeObject.getNodes().get(0)에서 수행하면 생성자가 params (반드시 있어야 함)와 함께 호출된다는 것입니다.

스프링 3.0.4.RELEASE를 사용하고 있습니다.

왜 이런 일이 일어날 수 있는지 아는 사람이 있습니까? 이게 버그일까요?

감사합니다.


UPDATE

나는이 AutoPopulatingList의 문제가 있다면 확인 AutoPopulatingList 유사한 목록의 사용자 정의 구현을 구축해야하지만,이 같은 행동을 발생합니다. 구현은 단지 오버라이드 (override) :

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] .something 노드를 보내 인덱스 0의 위치는 객체를 인스턴스화해야합니다. 그러나 문제는 tree.get (0)을 호출하기 전에 Node() 생성자가 호출된다는 것입니다. 그렇다면 Spring이 기본 생성자를 호출하는 이유는 무엇입니까? Node() 대신 객체를 인스턴스화하기 위해 tree.get (0)을 사용하도록하려면 어떻게해야합니까?

+0

당신은 "전에 아무 문제없이 사용해 왔지만 지금은 작동시킬 수 없습니다."라고 말했습니다. - 뭘 바꿨어? – Ralph

+0

누군가 나를 위해 트리를 채우기 시작하기 전에 트리에서 노드 목록을 제거하는 것처럼 보입니다. – Ralph

+0

@Ralph 다른 프로젝트에서 사용했기 때문에 스프링 버전 (스프링 3에도 불구하고)과 분명히 객체 만 변경했습니다. 그러나 나는 그것을 사용하는 방식을 바꾸지 않았다. – Javi

답변

15

바인더의 autogrownestedpaths를 비활성화하여 해결했습니다. 따라서 Autopopulating 목록에서 자체 공장에서 자동 성장을 처리 할 수 ​​있습니다.

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