Интерфейс:
public interface Manager {
Object read(Long id);
}
Класс, который реализует этот интерфейс:
@Transactional
Public class ManagerImpl implements Manager {
@Override
public Object read(Long id) {
// Implementation here
}
}
Аспект для ManagerImpl:
@Aspect
public class Interceptor {
@Pointcut("execution(public * manager.impl.*.*(..))")
public void executionAsManager() {
}
@Around("executionAsManager()")
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
// Do some actions
return joinPoint.proceed();
}
}
Контроллер:
@RestController()
public class Controller {
@Autowired
private Manager manager;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Object read(@PathVariable Long id) {
return manager.read(id);
}
@RequestMapping(value = "reflection/{id}", method = RequestMethod.GET)
public Object readViaReflection(@PathVariable Long id) {
return ManagerImpl.class.getMethod("read", Long.class).invoke(manager, id);
}
}
Итак, когда Spring вводит переменную менеджера в созданный прокси-сервер контроллера.
Когда метод вызывается напрямую:
manager.read(1L)
вызывается аспект.
Однако, когда я пытаюсь сделать так (см. readViaReflection),
ManagerImpl.class.getMethod("read", Long.class).invoke(manager, 1L);
got Объект java.lang.reflect.InvocationTargetException не является экземпляром объявленного класса.
Что разумно.
Вопрос в том, как я могу вызвать метод через отражение на прокси-объекте, созданном Spring (у меня есть метод, извлеченный из целевого объекта, и у меня есть экземпляр proxy, созданный Spring ).
Невозможно вызвать цель, потому что тогда аспект не будет вызываться.