복붙노트

[SPRING] 스프링 생성시 기본 생성자가 필요합니까?

SPRING

스프링 생성시 기본 생성자가 필요합니까?

몇 가지 인수가 필요한 생성자를 주입하려고합니다. Spring을 컴파일 한 후에는 기본 생성자를 찾을 수 없으며 (정의하지 않았 음) BeanInstatiationException 및 NoSuchMethodException을 발생시킵니다.

기본 생성자를 정의한 후에는 예외가 더 이상 나타나지 않지만 내 객체는 인수 생성자로 초기화되지 않으며 기본 생성자 만 호출됩니다. 이 경우에는 Spring이 실제로 기본 생성자를 필요로합니까? 그리고 그렇다면 어떻게 기본 생성자 대신 인수 생성자를 사용할 수 있습니까?

이것은 모든 것을 연결하는 방법입니다.

public class Servlet {

  @Autowired
  private Module module;

  (code that uses module...)
}

@Component
public class Module {

  public Module(String arg) {}
  ...
}

콩 구성 :

<beans>
  <bean id="module" class="com.client.Module">
    <constructor-arg type="java.lang.String" index="0">
    <value>Text</value>
    </constructor-arg>
  </bean>

  ...
</beans>

스택 추적 :

WARNING: Could not get url for /javax/servlet/resources/j2ee_web_services_1_1.xsd
ERROR  initWebApplicationContext, Context initialization failed
[tomcat:launch] org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'module' defined in URL [...]: Instantiation of bean failed;  
nested exception is org.springframework.beans.BeanInstantiationException: Could not 
instantiate bean class [com.client.Module]: No default constructor found; nested 
exception is java.lang.NoSuchMethodException: com.client.Module.<init>()

해결법

  1. ==============================

    1.인수없이 인스턴스화하려는 경우 Spring은 기본 생성자를 "요구"합니다.

    인수없이 인스턴스화하려는 경우 Spring은 기본 생성자를 "요구"합니다.

    예를 들어, 수업이 이와 같은 경우;

    public class MyClass {
    
      private String something; 
    
      public MyClass(String something) {
        this.something = something;
      }
    
      public void setSomething(String something) {
        this.something = something;
      }
    
    }
    

    당신은 이것을 봄처럼 설정했습니다.

    <bean id="myClass" class="foo.bar.MyClass">
      <property name="something" value="hello"/>
    </bean>
    

    당신은 오류가 발생할 것입니다. 그 이유는 Spring이 새로운 클래스를 인스턴스화하고 MyClass ()가 setSomething (..) 호출을 시도하기 때문이다.

    그래서 대신 Spring XML은 다음과 같이 보일 것이다.

    <bean id="myClass" class="foo.bar.MyClass">
      <constructor-arg value="hello"/>
    </bean>
    

    그래서 당신의 com.client.Module을 살펴보고 Spring xml에서 어떻게 구성되었는지보십시오.

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

    2.아마도 당신은 컴포넌트 스캐닝을 사용하고 있으며 Module 클래스에 대한 주석 @Component를 정의 했으므로 Bean을 인스턴스화하려고 시도했을 것입니다. Bean 정의를 위해 XML을 사용한다면 @Component 어노테이션이 필요 없다.

    아마도 당신은 컴포넌트 스캐닝을 사용하고 있으며 Module 클래스에 대한 주석 @Component를 정의 했으므로 Bean을 인스턴스화하려고 시도했을 것입니다. Bean 정의를 위해 XML을 사용한다면 @Component 어노테이션이 필요 없다.

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

    3.그냥 똑같은 문제에 직면했을 때까지 문제를 해결했을 수도 있습니다. 아래는 당신이 당신의 빈 설정을 바꿀 수있는 것입니다.

    그냥 똑같은 문제에 직면했을 때까지 문제를 해결했을 수도 있습니다. 아래는 당신이 당신의 빈 설정을 바꿀 수있는 것입니다.

    <bean id="module" class="com.client.Module">
            <constructor-arg value="Text"/>
    </bean>
    
  4. from https://stackoverflow.com/questions/18069756/is-default-constructor-required-in-spring-injection by cc-by-sa and MIT license