【问题标题】:How to pass parameter value to aspect如何将参数值传递给方面
【发布时间】:2021-05-05 03:00:34
【问题描述】:

我们如何从JointPoint(in 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);
    }
}

【问题讨论】:

    标签: spring-aop aspect


    【解决方案1】:

    共享的代码没有显示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(..)为合适的包名。

    【讨论】:

    • Kriegaex,感谢您的回答。是的,uId 没有传递给 namedJdbcTemplete.update,因为它不需要。但是对于日志,我需要同时拥有 uId、sql 和 namedParameters。对于您的 logDeleteTask,它不提供 sql 和命名参数。就像你说的,这似乎是不可能的。我正在考虑创建一个新方法来包装 namedJdbcTemplate.update 以传递 uId 并在方面使用该方法。我真的不喜欢这样做,因为我需要更改原始代码只是为了记录:(我希望我能找到更好的方法来处理这个......
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2014-03-22
    • 2021-12-13
    相关资源
    最近更新 更多