我正在尝试注入一个带有一些参数的构造函数。在编译Spring抱怨后,它找不到默认构造函数(我没有定义它)并抛出BeanInstatiationException和NoSuchMethodException。
定义默认构造函数后,异常不再出现,但是我的对象永远不会使用参数构造函数初始化,只会调用默认值。在这种情况下,Spring真的需要默认构造函数吗?如果是,我怎样才能使用参数构造函数而不是默认构造函数?
这是我连接所有内容的方式:
public class Servlet {
@Autowired
private Module module;
(code that uses module...)
}
@Component
public class Module {
public Module(String arg) {}
...
}
Bean配置:
<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>()
答案 0 :(得分:7)
如果你打算在没有任何参数的情况下实例化它,那么Spring只需要一个默认的构造函数。
例如,如果你的班级是这样的话;
public class MyClass {
private String something;
public MyClass(String something) {
this.something = something;
}
public void setSomething(String something) {
this.something = something;
}
}
你在Spring中设置它就像这样;
<bean id="myClass" class="foo.bar.MyClass">
<property name="something" value="hello"/>
</bean>
你会得到一个错误。原因是Spring实例化了您的类new MyClass()
,然后尝试设置调用setSomething(..)
。
所以相反,Spring xml应该是这样的;
<bean id="myClass" class="foo.bar.MyClass">
<constructor-arg value="hello"/>
</bean>
所以看看你的com.client.Module
,看看它在Spring xml中的配置方式
答案 1 :(得分:6)
很可能你正在使用组件扫描,因为你为类Module定义了注释@Component
,它会尝试实例化bean。如果您使用XML进行bean定义,则不需要@Component
注释。
答案 2 :(得分:2)
面对同样的问题,我想到现在你可能已经解决了这个问题 以下是您可以将bean配置更改为
的内容<bean id="module" class="com.client.Module">
<constructor-arg value="Text"/>
</bean>