You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring AOP切入点的args中绑定目标方法的多个参数

你当前的args表达式参数顺序和目标方法的入参顺序不匹配,Spring AOP的args是严格按照目标方法的参数声明顺序做匹配的,顺序错了就无法完成参数绑定。

首先明确目标方法的入参顺序是:startDate(LocalDate类型)→endDate(LocalDate类型)→privateInfoRequestDTO(PrivateInfoRequestDTO类型)→request(HttpServletRequest类型),你写的args(privateInfoRequestDTO, startDate, endDate, request)把DTO放在了第一位,和实际顺序不符,所以绑定失败。

正确的修改方式有两种:

方式一:调整args表达式顺序,直接绑定参数

修改切入点的args顺序和目标方法完全一致,同时通知方法的参数顺序也要对应:

// 切入点表达式调整参数顺序
@Before("@annotation(com.blah.blah.你的自定义注解全类名) && args(startDate, endDate, privateInfoRequestDTO, request)")
public void beforeAaaAdvice(LocalDate startDate, LocalDate endDate, PrivateInfoRequestDTO privateInfoRequestDTO, HttpServletRequest request) {
    // 此处可直接使用四个绑定好的参数
}

注意:通知方法的参数类型必须和目标方法对应位置的参数类型完全匹配,否则切入点会匹配失败。

方式二:通过JoinPoint直接获取所有入参

如果不想严格维护args的顺序,也可以直接在通知方法里注入JoinPoint,从JoinPoint中获取所有调用参数:

@Before("@annotation(com.blah.blah.你的自定义注解全类名)")
public void beforeAaaAdvice(JoinPoint joinPoint) {
    Object[] args = joinPoint.getArgs();
    // 按顺序强转即可拿到对应参数
    LocalDate startDate = (LocalDate) args[0];
    LocalDate endDate = (LocalDate) args[1];
    PrivateInfoRequestDTO dto = (PrivateInfoRequestDTO) args[2];
    HttpServletRequest request = (HttpServletRequest) args[3];
}

这种方式不需要写args表达式,适配性更高,适合参数可能会调整的场景。

内容的提问来源于stack exchange,提问作者dev.sunset

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:06:07