7

我正在尝试注入一个带有一些参数的构造函数。编译 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>()
4

3 回答 3

11

如果您打算在没有任何参数的情况下实例化它,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()然后尝试设置 call setSomething(..)

因此,Spring xml 应该如下所示;

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

所以看看你的com.client.Module,看看它是如何在你的 Spring xml 中配置的

于 2013-08-06T01:23:12.163 回答
6

很可能您正在使用组件扫描,并且由于您@Component为类 Module 定义注释,它会尝试实例化 bean。@Component如果您使用 XML 进行 bean 定义,则不需要注释。

于 2015-01-16T12:30:26.667 回答
2

刚刚遇到同样的问题,我想到目前为止你可能已经解决了这个问题。
以下是您可以将 bean 配置更改为的内容,

<bean id="module" class="com.client.Module">
        <constructor-arg value="Text"/>
</bean>
于 2014-09-17T08:43:07.277 回答