[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.인수없이 인스턴스화하려는 경우 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.아마도 당신은 컴포넌트 스캐닝을 사용하고 있으며 Module 클래스에 대한 주석 @Component를 정의 했으므로 Bean을 인스턴스화하려고 시도했을 것입니다. Bean 정의를 위해 XML을 사용한다면 @Component 어노테이션이 필요 없다.
아마도 당신은 컴포넌트 스캐닝을 사용하고 있으며 Module 클래스에 대한 주석 @Component를 정의 했으므로 Bean을 인스턴스화하려고 시도했을 것입니다. Bean 정의를 위해 XML을 사용한다면 @Component 어노테이션이 필요 없다.
-
==============================
3.그냥 똑같은 문제에 직면했을 때까지 문제를 해결했을 수도 있습니다. 아래는 당신이 당신의 빈 설정을 바꿀 수있는 것입니다.
그냥 똑같은 문제에 직면했을 때까지 문제를 해결했을 수도 있습니다. 아래는 당신이 당신의 빈 설정을 바꿀 수있는 것입니다.
<bean id="module" class="com.client.Module"> <constructor-arg value="Text"/> </bean>
from https://stackoverflow.com/questions/18069756/is-default-constructor-required-in-spring-injection by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 mvc 빈 배열을 기본값으로 사용 (0) | 2019.04.21 |
---|---|
[SPRING] 컨텍스트 : 구성 요소 스캔 방식의 프로그래밍 방식? (0) | 2019.04.21 |
[SPRING] Spring 부트 프로젝트에서 Hibernate가 LazyInitializationException을 던지지 않는다. (0) | 2019.04.20 |
[SPRING] lazily 초기화 된 CDI 빈을 만드는 방법은? (0) | 2019.04.20 |
[SPRING] Guice 컴포넌트를 Spring 애플리케이션에 통합 (0) | 2019.04.20 |