首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

关于spring3测试时加载注解bean的有关问题

2012-12-26 
关于spring3测试时加载注解bean的问题package com.zendaimoney.online.dao.pay@Componentpublic class Pa

关于spring3测试时加载注解bean的问题


package com.zendaimoney.online.dao.pay;

@Component
public class PayDao{
//一些方法
}


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PayDaoTest{


    @Autowired
    private ApplicationContext applicationContext;
    
//@Autowired
//  protected PayDao payDao;  //1.无法注入

    @Test
    public void findByUserId(){
        //2.applicationContext这个注入成功,但是在aplicationContext.getBean(PayDao.class);报错
    System.out.println(applicationContext==null);
    PayDao payDao=applicationContext.getBean(PayDao.class);
    System.out.println(payDao==null);

    //payDao.findByUserId(BigDecimal.valueOf(1));
    }


}


问题是,为什么在getBean的时候报错,但是com.zendaimoney.online.dao.pay.PayDao的路径和类名都是对的。却找不到bean?

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.zendaimoney.online.dao.pay.PayDao] is defined: expected single bean but found 0: 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:271)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1101)
at com.zendaimoney.online.dao.pay.PayDaoTest.findByUserId(PayDaoTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)


at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)




[解决办法]
No unique bean of type [com.zendaimoney.online.dao.pay.PayDao] is defined: expected single bean but found 0: 

你的用法不对
@ContextConfiguration( classes = { ApplicationConfig.class},loader = AnnotationConfigContextLoader.class )

ApplicationConfig.class是通过@Configuration注解指定 并创建Bean的 ,具体使用请参考我的博客
http://jinnianshilongnian.iteye.com/blog/1463704

[解决办法]


可是我把@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
改成@ContextConfiguration什么参数都不加是另外一个异常


java.lang.IllegalStateException: Neither GenericXmlContextLoader nor AnnotationConfigContextLoader was able to detect defaults for context configuration [ContextConfigurationAttributes@112e7f7 declaringClass = 'com.zendaimoney.online.dao.pay.PayDaoTest', locations = '{}', classes = '{}', inheritLocations = true, contextLoaderClass = 'org.springframework.test.context.ContextLoader'].
at org.springframework.test.context.support.DelegatingSmartContextLoader.processContextConfiguration(DelegatingSmartContextLoader.java:178)
at org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:311)
at org.springframework.test.context.TestContext.<init>(TestContext.java:100)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:117)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:119)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:108)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestMethodReference.<init>(JUnit4TestMethodReference.java:25)


at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:54)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)







引用:
No unique bean of type [com.zendaimoney.online.dao.pay.PayDao] is defined: expected single bean but found 0: 

你的用法不对
@ContextConfiguration( classes = { ApplicationConfig.class},loader……
 
[解决办法]
Neither GenericXmlContextLoader nor AnnotationConfigContextLoader was able to detect defaults for context configuration [ContextConfigurationAttributes@112e7f7 declaringClass = 'com.zendaimoney.online.dao.pay.PayDaoTest', locations = '{}', classes = '{}', inheritLocations = true, contextLoaderClass = 'org.springframework.test.context.ContextLoader'].


Neither GenericXmlContextLoader nor AnnotationConfigContextLoader  人家告诉你不能自动检测到默认的上下文  你需要指定
[解决办法]
碰到相同的问题,后来通过仔细查找,例如com.zendaimoney.online.dao.pay.PayDaoTest对应的路径,发现文件名多了一个空格,造成了和你一样的情况。

热点排行