如何在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
相关产品推荐
相关产品推荐

