Как определить конкретный параметр метода с помощью AOP?
Я пытаюсь @Before в АОП. У меня есть dto, где я реализовал интерфейс, а в методе контроллера dto является одним из параметров, и, поскольку он реализовал интерфейс, я хочу идентифицировать параметр с реализованным интерфейсом в разрезе точек. Я попробовал следующее
Сотрудник.java
package com.example.demo;
public class Employee implements UserData {
private String name;
private String id;
private String clazz;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
@Override
public String getData() {
String data=name+"_"+id;
return data;
}
}
контроллер
@RestController
public class HelloController {
@RequestMapping("/")
public String getEmployees(Employee emp) {
return "emp";
}
интерфейс
public interface Tenant {
String getData();
}
аспект
@Before("pointcut(tenant)")
public void before(Tenant tenant){
}
@Pointcut("execution(* com.example.demo.*.*(UserData))"+" &&
args(UserData))")
public void pointcut(UserData UserData) {
System.out.println("In aspect********************"+UserData.getData());
}
}
здесь в вышеупомянутом аспекте UserData не идентифицируется как экземпляр Employee . Как этого добиться? Я могу поставить (..) в точку, но я хочу, чтобы это было специфично для UserData.
2 ответа
Вы указали неверный аргумент в аннотации @Before. Мы должны предоставить JoinPoint в качестве аргумента.
@Before("execution(* com.example.demo.HelloController.getEmployees*(UserData))")
public void before(JoinPoint jp){
System.out.println("In aspect********************");
}
JointPoint имеет метод getArgs(), вы можете использовать его для получения параметров.
Пользователь Gaurav Srivastav был прав насчет JoinPoint
параметр для вашего совета, но вам также не нужно *
в getEmployees*
ни getArgs()
если вы просто хотите ограничить соответствие pointcut.
Вам нужно либо использовать полное имя класса (включая пакет), чтобы указать тип аргумента...
@Before("execution(* com.example.demo.HelloController.getEmployees(com.example.demo.UserData))")
public void before(JoinPoint thisJoinPoint) {
System.out.println(thisJoinPoint);
}
... или, если вам нужен доступ к параметру метода, вы можете связать его через args()
обозначение точки:
@Before(
"execution(* com.example.demo.HelloController.getEmployees(*)) && " +
"args(userData)"
)
public void before(JoinPoint thisJoinPoint, UserData userData) {
System.out.println(thisJoinPoint);
System.out.println(" " + userData);
}