Я использую Spring AOP для перехвата выполнения метода.Spring AOP: метод интерфейса с аннотацией параметра снят, но аннотации нет
У меня есть интерфейс, который выглядит следующим образом:
public interface MyAwesomeService {
public Response doThings(int id, @AwesomeAnnotation SomeClass instance);
}
Вот реализация интерфейса:
public class MyAwesomeServiceImpl implements MyAwesomeService {
public Response doThings(int id, SomeClass instance) {
// do something.
}
}
Теперь я хотел бы любой метод, который имеет параметр аннотированный с @AwesomeAnnotation должны быть захвачены Spring AOP.
Итак, я написал следующий аспект, который работает.
@Aspect
@Component
public class MyAwesomeAspect {
@Around("myPointcut()")
public Object doAwesomeStuff(final ProceedingJoinPoint proceedingJoinPoint) {
final MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
Annotation[][] annotationMatrix = methodSignature.getMethod().getParameterAnnotations();
// annotationMatrix is empty.
}
@Pointcut("execution(public * *(.., @package.AwesomeAnnotation (package.SomeClass), ..))")
public void myPointcut() {}
}
Однако, когда я пытаюсь найти аннотации параметров, я не получаю никаких аннотаций назад. Как упоминалось выше, аннотационная матрица пуста.
Так вот мои вопросы:
- Почему является annotationMatrix пустой? Вероятно, потому что аннотации параметров не наследуются от интерфейса.
- Почему я могу захватить выполнение метода. Поскольку Spring AOP способен сопоставлять pointcut, Spring каким-то образом может видеть аннотации параметров метода, но когда я пытаюсь увидеть, что использование
methodSignature.getMethod().getParameterAnnotations()
не работает.
Спасибо за ваш ответ. Я подозревал, что AspectJ, вероятно, смотрит на интерфейс, чтобы обнаружить аннотации. И так как во время выполнения аннотация из интерфейса не переносится, я не видел никакой информации о аннотации. Я решил эту проблему немного иначе, чем то, как вы указали. Я смотрю на интерфейс, чтобы увидеть, присутствует ли аннотация в определении интерфейса. – n00bc0der