问题描述
我们如何从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(..)
以获取合适的包名。