Spring @Transaction вызов метода методом внутри того же класса, не работает?

Я новичок в Spring Transaction. Некоторые вещи показались мне очень странными, возможно, я понял это правильно. Я хотел иметь транзакцию на уровне метода, и у меня есть вызывающий метод в том же классе, и похоже, что ему это не нравится, он должен быть вызван из отдельного класса. Я не понимаю, как такое возможно. Если у кого-то есть идея, как решить эту проблему, буду очень признателен. Я хочу использовать тот же класс для вызова аннотированного транзакционного метода.

Вот код:

public class UserService {

    @Transactional
    public boolean addUser(String userName, String password) {
        try {
            // call DAO layer and adds to database.
        } catch (Throwable e) {
            TransactionAspectSupport.currentTransactionStatus()
                    .setRollbackOnly();

        }
    }

    public boolean addUsers(List<User> users) {
        for (User user : users) {
            addUser(user.getUserName, user.getPassword);
        }
    } 
}
96
задан Gray 30 October 2012 в 20:47
поделиться

1 ответ

Это ограничение Spring AOP (динамические объекты и cglib).

Если вы настроите Spring на использование AspectJ для обработки транзакций, ваш код будет работать.

Простой и, вероятно, лучшей альтернативой является рефакторинг вашего кода. Например, один класс, который обрабатывает пользователей, и один, который обрабатывает каждого пользователя. Тогда стандартная обработка транзакций с помощью Spring AOP будет работать.


Советы по конфигурации для обработки транзакций с помощью AspectJ

Чтобы Spring использовал AspectJ для транзакций, вы должны установить режим AspectJ:

<tx:annotation-driven mode="aspectj"/>

Если вы используете Spring более старой версии, чем 3.0, вы также должны добавить это в конфигурацию Spring:

<bean class="org.springframework.transaction.aspectj
        .AnnotationTransactionAspect" factory-method="aspectOf">
    <property name="transactionManager" ref="transactionManager" />
</bean>
89
ответ дан 24 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: