我有下一个结构:
@Component public abstract class
HuginJob extends QuartzJobBean {...}
@Component("CisxJob") public class
CisxJob extends HuginJob {...}
现在我想测试CisxJob:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/applicationContext-test.xml" })
public class CisxJobTest {
@Autowired
@Qualifier("CisxJob")
private CisxJob cisxJob;
..... }
以下是applicationContext-test.xml
<context:annotation-config />
<context:component-scan base-package="no.hugin.jobscheduler" />
错误是
org.springframework.beans.factory.BeanCreationException: 创建名为“no.hugin.jobscheduler.job.cisx.CisxJobTest”的bean时出错:注入自动连接的依赖项失败; 嵌套异常是rg.springframework.beans.factory.BeanCreationException: 无法自动装配字段:private no.hugin.jobscheduler.job.cisx.CisxJob no.hugin.jobscheduler.job.cisx.CisxJobTest.cisxJob;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有为依赖项找到类型[no.hugin.jobscheduler.job.cisx.CisxJob]的匹配bean: 预计至少有1个bean可以作为此依赖项的autowire候选者。 依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = CisxJob)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) .............
问题在于扩展QuartzJobBean - 但我需要它。
谢谢
答案 0 :(得分:6)
问题在于Spring生成AOP代理的方式。当被代理的类实现任何接口时,Spring默认创建一个实现这些接口的JDK代理。
由于QuartzJobBean
实现了接口Job
,CisxJob
代理为Job
,并且该代理无法自动连接到CisxJob
类型的字段
有两种解决方案:
如果您的bean实现了任何接口,也要为其业务方法创建一个接口,并将其用作字段类型:
public interface CisxJob { ... }
@Component("CisxJob")
public class CisxJobImpl extends HuginJob implements CisxJob {...}
使用proxy-target-class模式:
<aop:aspectj-autoproxy proxy-target-class = "true" />
另见: