我想在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被nt识别为Employee的实例。如何实现?我可以把(..)放在切点但我希望它特定于UserData。
答案 0 :(得分:0)
您使用@Before注释提供了错误的参数。我们需要提供JoinPoint作为参数。
@Before("execution(* com.example.demo.HelloController.getEmployees*(UserData))")
public void before(JoinPoint jp){
System.out.println("In aspect********************");
}
JointPoint有方法getArgs(),你可以用它来获取参数。
答案 1 :(得分:0)
用户 Gaurav Srivastav 对于您的建议的JoinPoint
参数是正确的,但您既不需要*
中的getEmployees*
也不需要getArgs()
你只想限制切入点匹配。
您需要使用完全限定的类名(包括包)才能指定参数类型...
@Before("execution(* com.example.demo.HelloController.getEmployees(com.example.demo.UserData))")
public void before(JoinPoint thisJoinPoint) {
System.out.println(thisJoinPoint);
}
...或者,如果您需要访问method参数,可以通过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);
}