Как определить конкретный параметр метода с помощью AOP? - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь @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 ]

0 голосов
/ 11 июня 2018

Пользователь Гаурав Шривастав был прав насчет параметра JoinPoint для вашего совета, но вам не нужны ни * in getEmployees*, ни getArgs(), если вы просто хотите ограничить сопоставление точек.

Вам либо нужно использовать полное имя класса (включая пакет), чтобы указать тип аргумента ...

@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);
}
0 голосов
/ 10 июня 2018

Вы указали неверный аргумент в аннотации @Before.Мы должны предоставить JoinPoint в качестве аргумента.

  @Before("execution(* com.example.demo.HelloController.getEmployees*(UserData))")
    public void before(JoinPoint jp){
    System.out.println("In aspect********************");

}

JointPoint имеет метод getArgs (), вы можете использовать его для извлечения параметров.

...