如何将参数值传递给方面

问题描述

我们如何从JointPoint(在logJdbcoperation中)的调用方法(deleteTask)中获取参数值(uId)?我能够记录 sql 语句和 sql 参数,但找不到记录 uId 值的方法。 请指导我。

public int deleteTask(String taskname,String uId) {
        String sql = "delete from shedlock where NAME= :name";
        MapsqlParameterSource namedParameters = new MapsqlParameterSource();
        ((MapsqlParameterSource) namedParameters).addValue("name",taskname,Types.VARCHAR);
        return namedJdbcTemplate.update(sql,namedParameters);
}
@Aspect
@Component
public class LoggingAspect {

    private static final Logger LOGGER = LogManager.getLogger(LoggingAspect.class);

    @Before("execution(* org.springframework.jdbc.core..NamedParameterJdbcoperations.*(String,..))")
    public void logJdbcoperation(JoinPoint jp) {
        Object[] methodArgs = jp.getArgs();
        String statement = methodArgs[0].toString();
        MapsqlParameterSource params = (MapsqlParameterSource)methodArgs[1];
        LOGGER.debug("sql statement:" + statement);
    }
}

解决方法

共享的代码没有显示如何将 uId 传递给方法 namedJdbcTemplate.update(sql,namedParameters)。无法获取调用方法的参数。可以获取目标方法的任意参数。

以下代码将通知方法 deleteTask 并获取传递给它的参数。

@Around("execution(* package.deleteTask(..)) && args(taskName,uId)")
public Object logDeleteTask(ProceedingJoinPoint pjp,String taskName,String uId) {
  LOGGER.debug("Task Name :" + taskName);
  LOGGER.debug("Uid :" + uId);
  Object ret = 0;
  try {
    ret = pjp.proceed();
  } catch (Throwable e) {
    // handle exception if any
  }
  return ret;
}

参考:Passing Parameter to Advice

注意:记得修改 package.deleteTask(..) 以获取合适的包名。