Я хотел бы использовать пользовательскую аннотацию Java для вставки значения в свойство частного класса с помощью Spring AOP (и/или AspectJ). Краткий пример:
MyAnnotation.java:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface MyAnnotation {
}
MyController.java:
public class MyControllerImpl implements MyController {
...
@MyAnnotation
private String var1;
@Override
public String getVarExample() {
// imagine this is a REST API that gets called on @GET
// request and returns a string
System.out.println(this.var1); // <-- I'd like this to be "helloworld"
// this is just for illustration
// of course, I will want to do
// something more meaningful with
// the 'var1' variable
return "ok"; <- unimportant for this example
}
...
MyAspect.java:
@Aspect
@Component
public class MyAspect {
@Pointcut("@annotation(com.mypackage.annotation.MyAnnotation)")
public void fieldAnnotatedWithMyAnnotation() {
}
@Around("fieldAnnotatedWithMyAnnotation()")
public Object enrichVar1(ProceedingJoinPoint pjp) throws Throwable {
// problem #1 - the program never enters here
// problem #2 - I need to figure out how to set up the var1 here
// to "helloworld" , how?
return pjp.proceed();
}
...
}
Что бы я хотел, чтобы произошло?
Я позвоню и войду в getVarExample()
и после того, как он вернется, я хотел бы увидеть "helloworld" в консоли или журнале. Я хотел бы как-то установить var1
к пользовательскому значению с помощью AOP. Любая переменная свойства, которая будет помечена @MyAnnotation
будет установлено значение "адский мир". Я надеюсь, что приведенный выше пример понятен.
Что я пробовал?
Я убедился, что в названиях пакетов нет опечаток, а также повозился с различными аннотациями советов AOP, такими как @Around
и @Before
. Я также пробовал разные цели в MyAnnotation
и все закончилось тем, что ElementType.FIELD
что должно быть правильно.
Можете ли вы помочь мне заставить его работать?
Я знаю, что это можно сделать, но не смог найти ни одного рабочего примера в Интернете. Опять же, я хотел бы увидеть 2 ответа:
1. Как заставить точечный разрез срабатывать при входе в MyController? Я хочу поймать точку останова внутри enrichVar1(..)
способ проведения MyAspect
класс.
2. Как я могу изменить аннотированный var1
значение вenrichVar1(..)
способ проведения MyAspect
класс?
Я не знаю, что я делаю не так. Любая помощь будет очень признательна. Спасибо!
AOP правильно настроен в моем проекте. Я знаю это, потому что я уже использую AOP для разных целей (например, ведение журнала).
Обновление №1:
Пожалуйста, обратите внимание, что для var1
закрытая переменная. Переменная будет использоваться только в MyControllerImpl
. Чтобы лучше проиллюстрировать это, я изменил возвращаемое значение getVarExample
.