Как определить конкретный параметр метода с помощью 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);
}
Другие вопросы по тегам