2011-10-18 3 views
1

を見ることができない。ここでJUnitの4は、私はこのような私のクラスに@Beanと@Annotationを使用する豆

@Transactional 
@Configuration 
public class UserDAO { 

    @Bean 
    public UserDAO userDAO() 
    { 
     return new UserDAO(); 
    } 
    private HibernateTemplate hibernateTemplate; 

    @Autowired 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.hibernateTemplate = new HibernateTemplate(sessionFactory); 
    } 

    public void Save(User s){ 
     this.hibernateTemplate.save(s); 
    } 
} 

は私の春-servlet.xmlです。私は「userDAO」のような任意の豆を書くいけないことに注意してください:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    (...) 

    <context:annotation-config /> 
    <tx:annotation-driven transaction-manager="txManager" /> 
    <bean id="txManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory"> 
      <ref local="sessionFactory" /> 
     </property> 
    </bean> 
    <bean id="jspViewResolver" 
     (...) 
    </bean> 

    <bean id="pdfViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"> 
      (...) 
    </bean> 

    <bean 
     class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

    <bean class="org.springframework.jmx.export.MBeanExporter"> 
     <property name="autodetect" value="false" /> 
     <property name="assembler"> 
      <bean id="jmxAssembler" 
       class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> 
       <property name="attributeSource"> 
        <bean 
         class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" /> 
       </property> 
      </bean> 
     </property> 

    </bean> 
    <context:component-scan base-package="pl.edm.taskcards.spring" /> 
    <context:component-scan base-package="pl.raban.resource.spring" /> 

    <bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource" 
     p:basename="messages" /> 

    <bean id="openSessionInViewInterceptor" 
     class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     (...) 
    </bean> 




    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan"> 
      <list> 
       <value>pl.edm.taskcards.spring</value> 
       <value>pl.raban.resource.spring</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.connection.useUnicode">true</prop> 
       <prop key="hibernate.connection.characterEncoding">UTF-8</prop> 
       <prop key="hibernate.jdbc.batch_size">0</prop> 
       <prop key="hibernate.query.substitutions">true 1, false 0</prop> 
      </props> 
     </property> 
    </bean> 
    <tx:annotation-driven /> 

</beans> 

すべてがうまく働いた、私は私のWebアプリケーションでユーザーを保存することができます。今、私はこのような簡単なテストしたいと思う:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration (locations = {"classpath:**/spring-servlet.xml"}) 
@DependsOn("UserDAO") 
@Transactional 
@Configuration 
public class UserDAOTest extends AbstractTransactionalDataSourceSpringContextTests { 

    @Autowired 
    private UserDAO userDAO; 
    @Autowired 
    private SessionFactory sessionFactory; 

    public UserDAO getUserDAO() { 
     return userDAO; 
    } 
    public void setUserDAO(UserDAO userDAO) { 
     this.userDAO = userDAO; 
    } 
    public SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 


    @Test 
    public void testSave() { 
     User spr = new User(); 
     spr.setKzId(0); 
     spr.setOpis("User test"); 
     spr.setPlan("Plan test"); 
     spr.setPolrocze(1); 
     spr.setPrognoza1("test1"); 
     spr.setPrognoza2("test2"); 
     spr.setRok(2000); 
     userDAO.Save(spr); 
     User spr2 = userDAO.GetUserById(spr.getId()); 
     Assert.assertEquals("User test", spr2.getOpis()); 
    } 

} 

をしかし、私はこのテストを実行した後、私はエラーを得た:

> <pre>org.springframework.beans.factory.BeanCreationException: Error 
> creating bean with name 'pl.edm.taskcards.spring.UserDAOTest': 
> Injection of autowired dependencies failed; nested exception is 
> org.springframework.beans.factory.BeanCreationException: Could not 
> autowire field: private pl.edm.taskcards.spring.UserDAO 
> pl.edm.taskcards.spring.UserDAOTest.userDAO; nested exception is 
> org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> matching bean of type [pl.edm.taskcards.spring.UserDAO] found for 
> dependency: expected at least 1 bean which qualifies as autowire 
> candidate for this dependency. Dependency annotations: 
> {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
>  at 
> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288) 
>  at 
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074) 
>  at 
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:374) 
>  at 
> org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110) 
>  at 
> org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
>  at 
> org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321) 
>  at 
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211) at 
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 
>  at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
>  at 
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 
>  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:70) 
>  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) 
> Caused by: org.springframework.beans.factory.BeanCreationException: 
> Could not autowire field: private pl.edm.taskcards.spring.UserDAO 
> pl.edm.taskcards.spring.UserDAOTest.userDAO; nested exception is 
> org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> matching bean of type [pl.edm.taskcards.spring.UserDAO] found for 
> dependency: expected at least 1 bean which qualifies as autowire 
> candidate for this dependency. Dependency annotations: 
> {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
>  at 
> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 
>  at 
> org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
>  at 
> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) 
>  ... 26 more Caused by: 
> org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> matching bean of type [pl.edm.taskcards.spring.UserDAO] found for 
> dependency: expected at least 1 bean which qualifies as autowire 
> candidate for this dependency. Dependency annotations: 
> {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
>  at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924) 
>  at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793) 
>  at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707) 
>  at 
> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
>  ... 28 more</pre> 

答えて

3

私はここでいくつかのメカニズムを混乱させると思います。 @ConfigurationクラスはBeanを提供しますが、Bean自体ではありません。

@Componentを使用してBeanを直接作成するか、@Configurationアノテーションを別のクラスに配置します。

概念について詳しく読む:

A)3.10. Classpath scanning and managed components
B)3.11. Java-based container configuration

しかし、それはまだあなたが混乱した概念であっても、動作するはずです。

問題、しかし、ここでは次のようになります。

@ContextConfiguration (locations = {"classpath:**/spring-servlet.xml"}) 

2つの問題:
A)wildcards at the beginning of resource Strings are problematic
b)は、あなたの春のコンテキストがWEB-INFにある場合、それはクラスパス上にはありませんので、 "classpath:**/spring-servlet.xml"で見つかりません。

+0

xmlにコンポーネントスキャンがあり、UserDAOを選択する必要があります。 - Configurationはコンポーネントの一種であり、コンポーネントスキャンがそれを受け取るようにします。 – gkamal

+0

@gkamalあなたは正しいです。これは地獄のように醜いですが、問題はどこかにあると思います(私の更新を見てください)。ああ、私はちょうどあなたが同じ結論に来たのを見ました。 +1その:-) –

+0

私は同じ問題で走った。春が最初にワイルドカードについて文句を言ってくれるのは奇妙です... –

0

あなたはUserDaoクラスのBeanを宣言する必要があります。

+0

私のspring-servlet.xmlにbeanを書きますか?これが唯一の方法ですか? – Cichy

+0

はい。そして、私が知る限り、はい。 –

2

どこ春になる(FileSystemResource caveatsを参照)

@ContextConfiguration (locations = { 
    "file:/src/main/webapp/WEB-INF/spring-servlet.xml"}) 

:私は、標準的な方法は、ユニット/統合テストでは、このようなコンテキストにアクセスするためにあるのか分からないが、私はこのような何かを試してみました-servlet.xmlファイル - テストクラスでやっているようにclasspathを使ってロードできない場合、WEB-INFの下にあると思いますか?

関連する問題