Spring: менеджер транзакций не был настроен - PullRequest
2 голосов
/ 11 апреля 2009

Я боролся с этой проблемой некоторое время и не вижу решения. Надеюсь, что кто-нибудь может мне помочь.

У меня настроен HibernateTransactionManager. Тем не менее, я вижу следующее сообщение в файле журнала:

DEBUG [http-8080-1] AnnotationTransactionAttributeSource.getTransactionAttribute (107) | Добавление транзакционного метода [cashIn] с атрибутом [PROPAGATION_REQUIRED, ISOLATION_DEFAULT, -nl.forestfields.picnic.domain.model.exception.IllegalCostException]

DEBUG [http-8080-1] AnnotationTransactionAspect.createTransactionIfNeeded (267) | Пропуск транзакционной точки соединения [nl.forestfields.picnic.view.controller.ShoppingListController.cashIn], так как менеджер транзакций не настроен

Кроме того, в случае исключения транзакция не откатывается.

Вот моя конфигурация:

Пикник-servlet.xml:

  <beans>

    <context:component-scan base-package="picnic" />
    <context:annotation-config />

    <tx:annotation-driven />
    .
    .
    .

Пикник-контекстно-db.xml:

<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" id="sessionFactory">

    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
 </bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>${hibernate.connection.driver_class}</value>
    </property>
    <property name="url">
        <value>${hibernate.connection.url}</value>
    </property>
    <property name="username">
        <value>${hibernate.connection.username}</value>
    </property>
    <property name="password">
        <value>${hibernate.connection.password}</value>
    </property>
</bean>

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

Код, который должен быть выполнен внутри транзакции:

@Transactional(rollbackFor=IllegalCostException.class)
public ModelAndView cashIn(@RequestParam final Long id) throws IllegalCostException, llegalOrderStateException, IllegalShoppingListStateException {

  final ShoppingList shoppingList = shoppingListRepository.getById(id);
  shoppingList.cashIn();
  shoppingListRepository.add(shoppingList);

  return new ModelAndView(...);
}

Кто-нибудь может увидеть проблему?

Ура, Jippe

Ответы [ 5 ]

5 голосов
/ 11 апреля 2009

Попробуйте изменить

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

Не удалось найти здесь никакой другой проблемы.

2 голосов
/ 14 апреля 2009

Кроме того, откат происходит только для Непроверенные исключения . Если вы хотите выполнить откат для проверенных исключений, вам придется объявить его в аннотации @Transactional:

@Transactional(rollbackFor = { IllegalCostException.class, llegalOrderStateException.class })
public ModelAndView cashIn(@RequestParam final Long id) throws IllegalCostException, llegalOrderStateException, IllegalShoppingListStateException {

  final ShoppingList shoppingList = shoppingListRepository.getById(id);
  shoppingList.cashIn();
  shoppingListRepository.add(shoppingList);

  return new ModelAndView(...);
}
1 голос
/ 25 января 2012

Чтобы решить проблему, вы должны заявить:

<tx:annotation-driven />

в picnic-context-db.xml а не в picnic-servlet.xml

lrdblck

0 голосов
/ 17 октября 2011

Попробуйте изменить

`

   to 

Не могу найти здесь других проблем.

Это не может быть решением, потому что в весенней документации написано:

Вы можете опустить атрибут менеджера транзакций в тег, если имя бина PlatformTransactionManager, к которому вы хотите подключиться, имеет имя TransactionManager. Использование @ Transactional

Что-то еще, должно быть, изменилось ...

0 голосов
/ 17 апреля 2009

Вы говорите, что у вас есть два разных файла определения бина. Представляют ли они два разных контекста приложения или один импортирует другой?

В весенних документах по этому вопросу нет ясности, но может случиться так, что он автоматически определит bean-компонент транзакции, только если он находится в том же контексте, что и он сам. Если TransactionManager находится в родительском контексте, он может не найти его.

Как сказал Джерриш, просто явно укажите атрибут менеджера транзакций элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...