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);


    }
}

Вот как мы можем перехватить конкретный метод.

Другие вопросы по тегам