Spring MVC没有找到默认构造函数?

时间:2012-02-15 16:07:56

标签: java spring spring-mvc web.xml

我的Spring控制器出现了问题 - 我没有找到默认的构造函数 - 但是他们确实有一个我试图通过applicationContext.xml创建的构造函数 - 以下是相关的一点:

<bean id="PcrfSimulator" class="com.rory.services.pcrf.simulator.PcrfSimulator" init-method="start">  
</bean>

<bean id="CacheHandler" class="com.rory.services.pcrf.simulator.handlers.CacheHandler">
    <constructor-arg index="0" type="com.rory.services.pcrf.simulator.CustomGxSessionIdCacheImpl">
        <bean factory-bean="PcrfSimulator" factory-method="getGxSessionIdCache">
        </bean>
    </constructor-arg>       
</bean>

IE中。我首先创建一个bean,然后尝试将该bean的方法调用结果传递给第二个bean的(CacheHandler)构造函数。

这是CacheHandler的开始:

    @Controller
    public class CacheHandler {

    private final CustomGxSessionIdCacheImpl gxSessionIdCache;

    public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) {
        this.gxSessionIdCache = gxSessionIdCache;
    }

这是我得到的错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheHandler' defined in URL [jar:file:/users/rtorney/Documents/apache-tomcat-7.0.25/webapps/PCRFSimulator-4.0/WEB-INF/lib/PCRFSimulator-4.0.jar!/com/rory/services/pcrf/simulator/handlers/CacheHandler.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.rory.services.pcrf.simulator.handlers.CacheHandler]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.rory.services.pcrf.simulator.handlers.CacheHandler.<init>()

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:20)

你应该在xml中定义你的bean或者注释它们,而不是两者(如果只是为了避免你得到的错误)。

这里的问题是你没有自动装配构造函数args,所以spring不知道如何处理你的控制器。它知道它必须创建一个bean(@Controller注释),但它不知道如何(没有默认值,也没有autowired构造函数)。

您可以尝试执行以下操作:

@Controller
public class CacheHandler {

private final CustomGxSessionIdCacheImpl gxSessionIdCache;

@Autowired 
public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) {
   this.gxSessionIdCache = gxSessionIdCache;
} 

然后在xml中:

<bean id="gxSessionIdCache"
  factory-bean="PcrfSimulator"
  factory-method="getGxSessionIdCache"/>

因此它会自动装配构造函数参数。

另一个选择是简单地创建默认构造函数和autowire gxSessionIdCache属性。

答案 1 :(得分:2)

您必须添加一个空的默认构造函数:

    @Controller
    public class CacheHandler {

    private final CustomGxSessionIdCacheImpl gxSessionIdCache;

    @Autowired
    public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) {
        this.gxSessionIdCache = gxSessionIdCache;
    }

但请注意,因为您似乎正在混合基于注释的配置(@Controller)和XML配置。在上面的示例中,它使用基于注释的配置(因此请从XML文件中删除bean声明)。

答案 2 :(得分:0)

如果您尚未激活Spring的基于注释的配置,也可能会出现此错误。将它包含在Spring Xml中:

&LT;上下文:注解的配置/&GT;

答案 3 :(得分:0)

其他海报指出,如果将自动装配/组件扫描与bean的显式实例化混合,您可能会遇到问题。我有一个类似的问题与一个Web应用程序这样做。我能够通过告诉组件扫描程序不自动实例化关键类的bean来解决问题。像这样:

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns=...>

    <aop:aspectj-autoproxy />

    <import resource="repository.xml" />
    ...

    <context:component-scan base-package="com.example.webserver">
       <context:exclude-filter type="regex" expression="MyRepositoryImpl" />
       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
    </context:component-scan>
 </beans>

其中repository.xml包含显式bean实例化:

 <beans xmlns=...>
    <bean id="password" class="org.springframework.jndi.JndiObjectFactoryBean">
       <property name="jndiName" value="java:/comp/env/store/clientPassword" />
    </bean>
    <bean id="repository" class="com.example.webserver.datalayer.MyRepositoryImpl">
       <constructor-arg ref="password" />
    </bean>
...
 </beans>