Spring AOP setAdvice только по одному конкретному методу
У меня есть следующий класс:
package x.y.z;
public class MyClass{
public void someMethod(SomeObject object){
//do somethinng
}
public void {
//do somethinng
}
}
Теперь я хотел бы установить @PointCut
только по методу someMethod(SomeObject object, int param1)
Как мне это сделать?
Обновление я пытаюсь
@Pointcut("execution(x.y.z.MyClass.someMethod(x.y.z.SomeObject))") but I'm getting not well formed pointcut exception.
2 ответа
Решение
Точка среза должна быть:
target(x.y.z.MyClass) && execution(<RETURN TYPE> someMethod(x.y.z.SomeObject))
Присоедините AspectJ к вашему classpath и используйте плагин maven AOP для компиляции этого аспекта в байт-код, посмотрите на этот пример:
@Aspect
public class IOControlAspect {
@Around("execution(com...SomeClass.someMethod(*))")
public Object ioControlWrapper(ProceedingJoinPoint thisJoinPoint) throws Throwable {
{your code here}
return thisJoinPoint.proceed();
}
}
Предположим, у нас есть класс @Controller:
package co.gg.controller;
@Controller
public class LoginController {
@GetMapping(value="/getTenantRoles")
@ResponseBody
public String getTenantRoles(@RequestParam("tenant_id") String tenant_id) throws SQLException {
sqlConnection = con.makeconnection(dbName, dbPort, dbUserName, dbPass, dbHost);
String sql = "select * from tenant_role where tenant_id = "+tenant_id+" and is_active = 1 and is_deleted = 0;";
PreparedStatement preparedStatement = sqlConnection.prepareStatement(sql);
ResultSet rs = preparedStatement.executeQuery();
ArrayList<TenantRoleModel> tenantRoleModelList = new ArrayList<>();
while(rs.next()) {
TenantRoleModel currentModel = new TenantRoleModel(
rs.getInt("tenant_role_id"),
rs.getInt("is_deleted"),
rs.getInt("is_active"),
rs.getInt("tenant_id"),
rs.getString("role_name"),
rs.getString("create_date")
);
tenantRoleModelList.add(currentModel);
}
return new Gson().toJson(tenantRoleModelList);
}
}
Затем мы должны перехватить этот метод следующим образом:
package co.gg.AOP;
@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class Aspects {
@AfterReturning(value = "execution(* co.fdbk.controller.LoginController.getTenantRoles(..))", returning = "result")
public void afterAPICall(JoinPoint joinPoint,Object result){
System.out.println("AOP Method Name :"+ joinPoint.getSignature().getName());
System.out.println("AOP Return Value :"+ result);
}
}
Вот как мы можем перехватить конкретный метод.