Me gustaría usar personalizada de Java anotación para insertar un valor en un privado de la propiedad de clase utilizando Spring AOP (y/o AspectJ). Ejemplo rápido:
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();
}
...
}
Qué me gustaría que pasara?
Voy a llamar y entrar en la getVarExample()
y después devuelve me gustaría ver "helloworld" en la consola o de registro. Me gustaría de alguna manera la var1
a un valor personalizado el uso de AOP. Cualquier variable de propiedad que serán anotados con @MyAnnotation
"pasará a ser "helloworld". Espero que el ejemplo anterior es clara.
Lo he intentado?
De hecho estoy seguro que no hay ningún error en los nombres de los paquetes, también jugueteó con diferentes AOP asesoramiento anotaciones como @Around
y @Before
. También probé con diferentes objetivos en la MyAnnotation
y terminó con ElementType.FIELD
cual debe ser la correcta.
Me pueden ayudar a conseguir trabajo?
Sé que esto se puede hacer, pero no podía encontrar ningún ejemplo de trabajo en línea. De nuevo, me gustaría ver 2 respuestas:
1. Cómo obtener el pointcut para desencadenar en MyController entrada? Quiero coger un punto de interrupción dentro de la enrichVar1(..)
método de la MyAspect
clase.
2. ¿Cómo puedo modificar el anotado var1
valor enenrichVar1(..)
método de la MyAspect
la clase?
No sé qué estoy haciendo mal. Cualquier ayuda será muy apreciada. Gracias!
La AOP está configurado correctamente en mi proyecto. Yo lo sé porque yo ya estoy para el uso de AOP para diferentes cosas (tala de árboles, por ejemplo).
Actualización #1:
Por favor, tenga en cuenta que no hay captadores o incubadoras para el var1
variable privada. La variable que va a ser utilizado dentro de la MyControllerImpl
. Para ilustrar esto mejor que he cambiado el valor de retorno de la getVarExample
.