我的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>()
非常感谢任何帮助!
答案 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>