В AbstractIntegerConverter
сигнатура метода не public Integer convert(String input)
, а public Integer convert(T input)
, поэтому ваш pointcut * *..*.Converter+.convert(String)
не совпадает. Вместо этого используйте Object
или *
и проверьте тип среды выполнения с помощью args()
вместо использования сигнатуры времени компиляции:
@Around("execution(* *..Converter+.convert(*)) && args(input)")
public Object adviceStringConverter(ProceedingJoinPoint joinPoint, String input) throws Throwable {
System.out.println(joinPoint);
return joinPoint.proceed();
}
С моей добавленной строкой журнала вы увидите на консоли что-то вроде:
execution(Integer de.scrum_master.app.AbstractIntegerConverter.convert(Object))
См? convert(Object)
, а не convert(String)
, следовательно, несоответствие.
P.S .: Это был интересный вопрос, не такой скучный, как у большинства AspectJ или Spring AOP. Так что спасибо за это. :-)
Обновление:
Что касается вашего дополнительного вопроса, вот что печатает javap -s
(аспект деактивирован):
javap -s AbstractIntegerConverter.class
Compiled from "AbstractIntegerConverter.java"
public abstract class de.scrum_master.app.AbstractIntegerConverter<T> implements de.scrum_master.app.Converter<T, java.lang.Integer> {
public de.scrum_master.app.AbstractIntegerConverter();
descriptor: ()V
public java.lang.Integer convert(T);
descriptor: (Ljava/lang/Object;)Ljava/lang/Integer;
public abstract java.lang.Integer defaultValue();
descriptor: ()Ljava/lang/Integer;
public java.lang.Object convert(java.lang.Object);
descriptor: (Ljava/lang/Object;)Ljava/lang/Object;
}
См? Подпись convert(Object)
, как показывает вывод журнала моего аспекта.
javap -s StringToIntegerConverter.class
Compiled from "StringToIntegerConverter.java"
public class de.scrum_master.app.StringToIntegerConverter extends de.scrum_master.app.AbstractIntegerConverter<java.lang.String> {
public de.scrum_master.app.StringToIntegerConverter();
descriptor: ()V
public java.lang.Integer defaultValue();
descriptor: ()Ljava/lang/Integer;
}
И нет метода convert(String)
или convert(whatever)
в классе бетонного преобразователя.
Вы мне сейчас верите?