[SPRING] 자식 클래스의 constructor-arg를 전달할 때 "일치하는 생성자를 해결할 수 없습니다."오류
SPRING자식 클래스의 constructor-arg를 전달할 때 "일치하는 생성자를 해결할 수 없습니다."오류
저는 다음과 같은 수업을 듣습니다 :
public abstract class ParentClass
{
public ParentClass()
{
throw new RuntimeException("An ID must be specified.");
}
public ParentClass(String id)
{
this(id, DEFUALT_ARG_VALUE);
}
public ParentClass(String id, int anotherArg)
{
this.id = id;
//stuff with anotherArg
}
public abstract void doInstanceStuff();
}
public class ChildClass extends ParentClass
{
@Override
public void doInstanceStuff()
{
//....
}
}
내 응용 프로그램 컨텍스트에서 나는 이것을 가지고 :
<bean id="myChildInstance" class="com.foo.bar.ChildClass " scope="singleton">
<constructor-arg value="myId" />
</bean>
문제는 서버가 시작될 때 다음 오류가 발생한다는 것입니다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ivpluginHealthCheckTest' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
오류를보고, 나는 다른 속성을 추가하려했지만 행운이 없었다. 나는 이런 식으로 끝났다.
<bean id="myChildInstance" class="com.foo.bar.ChildClass " scope="singleton">
<constructor-arg value="myId" index="0" type="java.lang.String" name="id" />
</bean>
그리고 나는 여전히 같은 오류가 발생합니다.
내 생성자 클래스에 동일한 생성자를 추가하고 각각에 대해 적절한 인수가있는 super ()를 호출하면 해결할 수 있습니다. 그러나 모든 자식 인스턴스에 동일한 생성자를 추가하지 않고 부모 클래스와 함께 생성자를 유지 관리해야합니다.
Spring이 상속 된 생성자를 호출하여 클래스를 인스턴스화하는 데 문제가있는 이유가 있습니까? 이 일을하기 위해 내가 할 수있는 일이 있습니까?
해결법
-
==============================
1.생성자는 결코 상속받지 않으며 실제로 이해가되지 않습니다. 생성자는 특정 클래스의 상태를 초기화합니다. Parent의 생성자가 Child 클래스의 상태를 초기화 할 것으로 기대할 수는 없습니다. 그것은 Child 클래스에서만 생성자의 작업입니다.
생성자는 결코 상속받지 않으며 실제로 이해가되지 않습니다. 생성자는 특정 클래스의 상태를 초기화합니다. Parent의 생성자가 Child 클래스의 상태를 초기화 할 것으로 기대할 수는 없습니다. 그것은 Child 클래스에서만 생성자의 작업입니다.
그래서, 당신은 당신이하려고하는 것을 할 수 없습니다. 그리고 그것은 봄 문제가 아닙니다. 그것은 매우 근본입니다.
-
==============================
2.짧은 대답 : 생성자는 Java에서 상속되지 않습니다.
짧은 대답 : 생성자는 Java에서 상속되지 않습니다.
JLS에서 :
Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.
즉, 각 하위 클래스에 필요한 생성자를 선언하고 해당 슈퍼 생성자를 호출해야합니다. 동일한 서명이 있어도 재정의 것으로 간주되지 않습니다.
-
==============================
3.자식 클래스에 생성자를 제공하지 않으면 컴파일러는 인수가없는 생성자를 삽입하고 첫 번째 행을 super no-arg 생성자에 대한 호출로 추가합니다 따라서 코드는 다음과 같이됩니다.
자식 클래스에 생성자를 제공하지 않으면 컴파일러는 인수가없는 생성자를 삽입하고 첫 번째 행을 super no-arg 생성자에 대한 호출로 추가합니다 따라서 코드는 다음과 같이됩니다.
public class ChildClass extends ParentClass { public ChildClass() { super(); } }
분명히, 당신은 생성자를 추가하고 String 인수를 취하는 슈퍼 constrcutor를 호출하는 것이 좋습니다 problem.I를 일으킬 수 null 포인터 예외를 던졌습니다 :
public class ChildClass extends ParentClass { public ChildClass(String id) { super(id); } @Override public void doInstanceStuff() { // .... } }
이것은 모든 문제를 해결해야합니다 ...
참고 : - 인수 생성자를 추가하면 컴파일러에서 기본 생성자를 추가하지 않습니다.
이제 bean은 문자열 인수 생성자를 호출 할 때 제대로 초기화 될 것입니다. 현재 컴파일러는 당신의 no arg 부모 클래스 생성자를 호출하고 널 포인터 예외를 던지는 디폴트 no-arg constrcutor를 제공합니다.
from https://stackoverflow.com/questions/21583399/could-not-resolve-matching-constructor-error-when-passing-in-constructor-arg-f by cc-by-sa and MIT license