Spring 3 проблемы с TransactionManager и аннотациями - PullRequest
2 голосов
/ 15 июля 2011

Я пытаюсь настроить TransactionManager в моем веб-приложении (на основе Spring MVC 3), поскольку мне нужно иметь один метод компонента, помеченный как @ Transactional.

Это моя ситуация:

  • web.xml: загрузить 2 xml-файла для Spring ContextLoaderListener (applicationContext.xml и database.xml)
  • applicationContext.xml: содержит некоторые bean-компоненты, которые я не могу определить с помощью аннотации, плюс теги для аннотации, плюс обычный контекст: annotation-config и context: component-scan (это сканирование компонентов включает в себя пакет, содержащий @Transactional method)
  • database.xml: содержит источник данных (я использую BasicDataSource из commons-dbcp), определение менеджера транзакций и tx: annotation-driven.

У меня есть @Component (DeleteComponent), который имеет интерфейс и реализацию (DeleteComponentImpl). Класс реализации аннотирован @Component и имеет один открытый метод, аннотированный @Transactional (я аннотировал конкретный класс, а не интерфейс, как говорится в документации Spring). Для @Transactional я не ставил никаких аргументов, так как по умолчанию все в порядке. В этом классе есть несколько DAO (помеченных @Repository), которые вводятся через @Autowired. Я использую только обычный JDBC (без Hibernate или другого ORM). Этот @Component внедряется в @Controller (который определен в spring-servlet.xml).

Если метод, аннотированный как @Transactional, выдает исключение (не отмеченное, как RuntimeException), тем не менее, ничего не откатывается. База данных сохраняет изменения, сделанные до исключения. Я использую веб-сервер Jetty для локального тестирования моего приложения. То, что я заметил, на самом деле, похоже, что менеджер транзакций не настраивается. На самом деле, мой менеджер транзакций называется «actionManager ». Строка xml для настройки транзакции на основе аннотаций:

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

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

Если я изменю его на использование несуществующего имени компонента, например

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

Приложение по-прежнему правильно развертывается и не жалуется.

Какие-нибудь советы о том, что я должен проверить, чтобы это работало?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 июля 2011

Я решил с помощью @Transactional (rollbackFor = RuntimeException.class) и переключения с BasicDataSource на ComboPooled, который присутствует в библиотеке c3p0. Спасибо за предложения, хотя.

1 голос
/ 15 июля 2011

Чтобы получить откат при возникновении исключения, добавьте:

@Transactional(rollbackFor=Exception.class)

Вам также нужно будет настроить bean-компонентactionManger (здесь мой, использующий hibernate):

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
                p:sessionFactory-ref="sessionFactory" />

Я нашел этот учебник информативным.

0 голосов
/ 15 июля 2011

Я считаю, что @Autowired и @Resource не сканируются Spring на @Component.Попробуйте использовать класс ContextHolder, чтобы получить контекст и DAO

@Component
public class ContextHolder implements ApplicationContextAware {

    /** 
     * Spring context which will directly be injected by Spring itself
     */
    private static ApplicationContext context = null;

    /**
     * Overridden method of ApplicationContextAware, which will automatically be called by the container
     */
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        this.context = context;
    }

    /**

    /**
     * Static method used to get the context
     */
    public static ApplicationContext getApplicationContext() {
        return context;
    }
}

и вызвать ваш дао с помощью:

ContextHolder.getApplicationContext().getBean("MyDAO");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...