У меня была похожая проблема с атрибутом [Transaction]
(который работает с использованием Spring.AOP
).
В моем случае я вызвал помеченные [Transaction]
методы из одного и того же класса и был удивлен, что совет по транзакции не сработал.
Объяснение состояло в том, что при вызове метода, помеченного [Transaction]
из класса, вы держите ссылку на реальный экземпляр вместо экземпляра с прокси AOP, поэтому вызов не перехватывается.
Когда в приложение MVC делается запрос, из URL-адреса запроса выбирается контроллер (из экземпляра IControllerFactory
). На этом контроллере вызывается метод Execute
, который, в свою очередь, отвечает за вызов действий. Поэтому я думаю, что методы действия всегда вызываются из контроллера . Это означает, что по определению методы действия никогда не будут перехвачены. Это объяснило бы, почему эти точки были распознаны, но не срабатывают.
если я возьму другой класс, чем
контроллер как pointcut работает
Это также объясняет, почему запускаются pointcut для других классов, кроме контроллеров: они, вероятно, вызываются из контроллера, который будет содержать ссылку на прокси AOP на экземпляры других классов.
... для некоторых методов работает совет ... Например, для установщика для
хранилище
Я предполагаю, что у вашего (например) CompanyController.CustomerController
есть свойство CustomerRepository
, установленное с помощью DI. Имеет смысл, что этот pointcut срабатывает, потому что сеттер вызывается извне CompanyController.CustomerController
, например, вашим DI-контейнером (или вашим ControllerFactory
).
Решением может быть введение сервисных объектов, для которых вы определяете рекомендации по транзакциям, которые вы теперь имеете на своих контроллерах. С ваших контроллеров вы вызываете методы для этих сервисных объектов - и затем запускаются pointcuts.