Сбой @Controller, @Service, @Repository bean-компонента @EnableTransactionManagement в mode = AdviceMode.PROXY или сбой по умолчанию - PullRequest
0 голосов
/ 02 октября 2019

Зачем использовать @ EnableTransactionManagement в режиме по умолчанию или в режиме PROXY для попыток создания бинов, таких как @ Controller , @ Service и @ Repositories . Я не отказываюсь от другого вида бинов, нацеленных на это плохое поведение.

У меня есть проект с :

  • SpringBoot 2.1. 8.RELEASE + JPA + Rest Controller
  • PostgreSQL 9,6
  • @ Transactional аннотация к таким методам, как save, update и delete (также пакетное удаление)

Создает прокси-классы и обнуляет остальные компоненты в ApplicationContext.

EnableTransactionManagement default/PROXY advice mode

1 Ответ

0 голосов
/ 02 октября 2019

Режим по умолчанию: ПРОКСИ . Когда установлен режим рекомендации ASPECTJ , все бины вводятся в нужном месте. Проверьте текущие документы Spring по теме .

Атрибут mode() контролирует, как применяется совет: если режим AdviceMode.PROXY (по умолчанию), то другие атрибутыконтролировать поведение прокси. Обратите внимание, что режим прокси позволяет перехватывать звонки только через прокси;локальные вызовы внутри одного и того же класса не могут быть перехвачены таким образом.

Обратите внимание, что если для mode() установлено значение AdviceMode.ASPECTJ, то значение атрибута proxyTargetClass() будет игнорироваться. Также обратите внимание, что в этом случае JAR-модуль аспекта пружины должен присутствовать в пути к классам, при этом во время компиляции или во время загрузки применяется аспект к затронутым классам. В таком сценарии нет посредника;местные звонки будут также перехватываться.

Примерно так:

EnableTransactionManagement ASPECTJ advice mode

Все еще, @Транзакционные методы терпят неудачу. Из-за « TransactionRequiredException », поэтому ASPECTJ не решает проблему на уровне персистентности, только предоставляет внедрение бинов (возможно, не создан менеджер транзакций платформы). Что делать дальше?

См. Исключение транзакции:

Transaction Exception

!!! Решение:

При работе с транзакциями область должна совместно использоваться в цепочке компонентов: @Service (также, метод вызывающего абонента) <- @ Repository (также, метод транзакций), контекст @Service (класс, метод) должен быть помечен как @Transactional. Применяется к аннотированным методам или классам в стеке вызовов, который заканчивается транзакционной операцией (<em> восходящий подход).

Последовательность аннотаций:

  1. @ EnableTransactionManagement (в классах @Configuration или в @SpringBootApplication -autoconfiguration -)
  2. @ Transactional с комментариямиметод / классы в цепочке внедрения бобов ( снизу вверх : постоянный метод / класс, затем слои @ Service / @ Component)
  3. @ Autowired аннотация на бинах-кандидатах ( экземпляр службы в классе @Controller, экземпляр репозитория в классе @Service)

Примечание: SpringAOP не создает свойства proxy из функций на основе функциональных интерфейсов, поэтому рекомендуется использовать только экземпляры объектов, использующие методы инкапсуляции логики постоянства.

например,

Function<T, R> function 
BiFunction<T1,T2,R> function 
Supplier<T> supplier
... 
...