@TransactionConfiguration (transactionManager = «txManager») NoSuchBeanDefinitionException: не определен бин с именем «txManager»

1

Я пытаюсь написать тестовый класс, проверять метод dao. Метод dao делает выбор из таблицы jobseeker после электронной почты, и он использует getCurrentSession, из-за этого я делаю свой тестовый класс следующим образом

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations="classpath:spring-config.xml") 
@TransactionConfiguration(transactionManager="txManager")
@Transactional
public class JobSeekerServiceTest {

    private JobSeekerDao jobseekerServiece = new JobSeekerDao();

    @Test
    public void testGetCandidateForEmail(){
        JobSeeker result = new JobSeeker();
        JobSeeker expected = new JobSeeker();
        expected.setName("Dummy Job seeker 1");expected.setEmail("[email protected]");expected.setCity("City");expected.setPhone("04523122");

        result = jobseekerServiece.getCandidateForEmail("[email protected]");
        assertEquals(result, expected);
    }
}

весна-config.xml

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
            <property name="driverClassName"    value="${database.driver}" />  
            <property name="url"                value="${database.url}" />  
            <property name="username"           value="${database.user}" />  
            <property name="password"           value="${database.password}" />  
        </bean>  

        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
            <property name="dataSource" ref="dataSource" />
            <property name="packagesToScan" value="com.awinta.hrms"/>

            <property name="hibernateProperties">  
                <props>  
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
                    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                    <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                    <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>

                    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>

                    <prop key="hibernate.temp.use_jdbc_metadata_defaults">${hibernate.temp.use_jdbc_metadata_defaults}</prop>

                    <prop key="hibernate.connection.pool_size">${hibernate.connection.pool_size}</prop>
                </props>  
            </property>  
        </bean> 

        <bean id="txManager" 
            class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
            name="txManager">  
            <property name="sessionFactory" ref="sessionFactory" />
        </bean> 

        <tx:annotation-driven transaction-manager="txManager"/> 

Метод Дао

@SuppressWarnings("unchecked")
        @Override
        public JobSeeker getCandidateForEmail(String email) {
            LOGGER.debug("Searching the candidate after an email:"+email);
            Session session = getCurrentSession();

            List<JobSeeker> candidates = session.createQuery("from JobSeeker where email=?")
                    .setParameter(0, email)
                    .list();


            if (candidates.size() > 0) {
                return candidates.get(0);
            } else {
                return null;
            }
        }

ошибка

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'txManager' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:660)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.test.context.transaction.TestContextTransactionUtils.retrieveTransactionManager(TestContextTransactionUtils.java:157)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:352)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:335)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:193)
    at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:249)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:71)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:81)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:216)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:82)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:60)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:67)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:162)
    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:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

У меня нет идей, почему я получаю это, когда у меня есть bean с именем txManager. Любая помощь была бы замечательной.

Теги:
hibernate
junit

2 ответа

1

Для вашей конфигурации XML потребуется следующая строка:

<tx:annotation-driven transaction-manager="txManager"/>

Это позволяет управлять транзакциями на основе аннотаций.

Если вы используете Java Config, аннотация @EnableTransactionManagement в классе конфигурации делает то же самое.

Изменить для получения дополнительной информации

Вы также можете полностью @TransactionConfiguration аннотацию @TransactionConfiguration. Дополнительную информацию см. В документации. Единственная причина, по которой вам может понадобиться @TransactionalConfiguration - переопределить конфигурацию отката по умолчанию, которую вы не делаете в приведенном выше примере. http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/testing.html#testcontext-tx

  • 0
    Извините, я забыл поместить эту строку в этот код, но у меня есть в моем дао, я исправил сейчас
  • 0
    @FAndrew Вы все еще получаете ту же проблему? Убедитесь, что ваш sprint-config.xml находится в пути к классам, в случае, если он просто не может найти файл XML.
0

Включить управление транзакциями на основе аннотаций, используя описанные здесь.

  • 0
    Можете ли вы дать мне ссылку на пример? Я не очень понял отсюда.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню