Весенняя транзакция с AspectJ

У меня проблема с @Transaction в Spring. По сути, транзакция не создается со следующим сообщением:

задержка вставки идентификационной информации из-за отсутствия выполняемой транзакции

Я разместил полное описание проблемы на форуме Spring AOP.

http://forum.springsource.org/showthread.php?132612-Transaction-management

Любое предложение будет оценено!

Стефано


person Stefano Cazzola    schedule 21.11.2012    source источник
comment
Не могли бы вы опубликовать полную трассировку стека. - Главным образом, чтобы убедиться, что мы ищем в нужном месте. Потому что код выглядит нормально.   -  person Ralph    schedule 22.11.2012


Ответы (2)


в вашем коде вы определили службу следующим образом:

@Service
@Configurable
public class ServiceImpl<T> implements Service<T> {
@Override
@Transactional
public T save(T entity) {
          ....
    }
}

Я не знаю, почему вы используете аннотацию @Configurable. Если они вам не нужны (то есть если вы не создаете экземпляр этой службы через new), я бы их удалил.

Причина в том, что я помню документ Spring, в котором говорилось, что @Configurable разрешает внедрение, но ничего не говорится о поддержке переплетения во время загрузки, включенной @Configurable

person Ralph    schedule 21.11.2012
comment
Вы правы насчет @Configurable, а аннотация @Service является специализацией @Component. Однако транзакционный аспект должен быть переплетен из-за аннотации @Transactional на уровне метода, как указано в документе. - person Stefano Cazzola; 22.11.2012
comment
Я забыл... Я попробовал ваше предложение, но результат не изменился. - person Stefano Cazzola; 22.11.2012

Решение найдено.

Проблема была в конфигурации. Я добавил два элемента context:spring-configured и context:load-time-weaver, которые означают две разные вещи. Первый активирует переплетение времени компиляции AspectJ (чего я не понял), второй активирует переплетение времени загрузки AspectJ. Я думаю, что эти два элемента плохо работают вместе.

Я решил использовать Weaver во время компиляции и (попробовав немного...) обнаружил, что (очевидно) внешние jar-файлы не переплетаются с этой конфигурацией просто потому, что они еще не созданы.

Самый простой способ решить эту проблему — изменить конфигурацию aspectj-maven-plugin (в POM.xml), добавив под узлом configuration:

<weaveDependencies> <weaveDependency> <groupId>GROUP-ID</groupId> <artifactId>ARTIFACT-ID</artifactId> </weaveDependency> </weaveDependencies>
для каждого артефакта, который вам нужно сплести.

Теперь транзакции работают нормально!

@Ralph: большое спасибо за ваше время!

С уважением,

Стефано

person Stefano Cazzola    schedule 22.11.2012