복붙노트

[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. ==============================

    1.생성자는 결코 상속받지 않으며 실제로 이해가되지 않습니다. 생성자는 특정 클래스의 상태를 초기화합니다. Parent의 생성자가 Child 클래스의 상태를 초기화 할 것으로 기대할 수는 없습니다. 그것은 Child 클래스에서만 생성자의 작업입니다.

    생성자는 결코 상속받지 않으며 실제로 이해가되지 않습니다. 생성자는 특정 클래스의 상태를 초기화합니다. Parent의 생성자가 Child 클래스의 상태를 초기화 할 것으로 기대할 수는 없습니다. 그것은 Child 클래스에서만 생성자의 작업입니다.

    그래서, 당신은 당신이하려고하는 것을 할 수 없습니다. 그리고 그것은 봄 문제가 아닙니다. 그것은 매우 근본입니다.

  2. ==============================

    2.짧은 대답 : 생성자는 Java에서 상속되지 않습니다.

    짧은 대답 : 생성자는 Java에서 상속되지 않습니다.

    JLS에서 :

    Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding. 
    

    즉, 각 하위 클래스에 필요한 생성자를 선언하고 해당 슈퍼 생성자를 호출해야합니다. 동일한 서명이 있어도 재정의 것으로 간주되지 않습니다.

  3. ==============================

    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를 제공합니다.

  4. 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