Chtěl bych použít vlastní Java anotace chcete-li vložit hodnotu v privátní třídy majetku použití Spring AOP (a/nebo AspectJ). Rychlý příklad:
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();
}
...
}
Co bych chtěl, aby se stalo?
Zavolám a dostat se do getVarExample()
a po návratu bych rád viděl "helloworld" v konzoli, nebo se přihlásit. Chtěl bych nějak nastavit var1
na vlastní hodnotu pomocí AOP. Žádný majetek proměnnou, která bude komentovaný s @MyAnnotation
bude nastavena na "helloworld". Doufám, že výše uvedený příklad je jasný.
Co jsem zkoušel?
Ujistil jsem se, že tam není žádný překlep v názvu balíčku, také si pohrávala s různými AOP poradenství popisy jako @Around
a @Before
. Zkoušel jsem i různé cíle v MyAnnotation
a skončil s ElementType.FIELD
což by měla být správná.
Můžete mi pomoci, aby si to funguje?
Vím, že to lze udělat, ale nemohl najít žádné pracovní příklad on-line. Opět bych rád viděl 2 odpovědi:
1. Jak se dostat pointcut pro spuštění na MyController vchod? Chci chytit zarážku uvnitř enrichVar1(..)
metoda MyAspect
třídy.
2. Jak mohu změnit komentovaný var1
hodnota venrichVar1(..)
metoda MyAspect
třída?
Nevím, co dělám špatně. Jakákoliv pomoc bude velmi ocenil. Děkuji!!!
AOP je správně nastaven v mém projektu. Vím to, protože jsem už pomocí AOP pro různé věci (protokolování pro příklad).
Update #1:
Prosím, na vědomí, že nejsou getter nebo setter pro var1
soukromé proměnné. Proměnné budou použity pouze v rámci MyControllerImpl
. Pro ilustraci lepší jsem změnil návratová hodnota getVarExample
.