Java AspectJ-关于控制器请求方法不起作用的建议

Java AspectJ-关于控制器请求方法不起作用的建议,java,spring,spring-mvc,aspectj,Java,Spring,Spring Mvc,Aspectj,尝试在控制器包中的所有请求方法(全部GET和POST)上调用around通知。该建议不适用于请求方法。下面是我的控制器和方面建议方法 此外,我需要打印请求映射参数,如方法类型(Get或Post)和请求的URL。 控制器类: package net.prc.sales.web.controller; //进口 @SessionAttributes({Dictionary.FORM_DRIVER_INFO}) @控制器 公共类CustomerInfoController{ @RequestMappi

尝试在控制器包中的所有请求方法(全部GET和POST)上调用around通知。该建议不适用于请求方法。下面是我的控制器和方面建议方法

此外,我需要打印请求映射参数,如方法类型(Get或Post)和请求的URL。

控制器类:

package net.prc.sales.web.controller;
//进口
@SessionAttributes({Dictionary.FORM_DRIVER_INFO})
@控制器
公共类CustomerInfoController{
@RequestMapping(value=Dictionary.URL\u QUOTE\u CUSTOMER\u INFO,method=RequestMethod.GET)
公共模型和视图custinfo(模型模型,HttpSession会话)引发SessionExpiredException{
ModelAndView mav=新ModelAndView();
// ...
}
// ...
}
方面忠告:

@Around(“net.prc.sales.web.controller.*(..)&&&&“+”@annotation(RequestMapping)”)
公共作废我们周围的建议(处理接合点法){
System.out.println(“在通知部分之前:在方法执行之前调用。\n”);
试一试{
方法。继续();
System.out.println(“返回通知部分后:在方法正常返回后调用。\n”);
}捕获(可丢弃的e){
System.out.println(“在抛出通知部分之后:在方法抛出异常之后调用。\n”);
}
}

@AleksiYrttiaho是正确的,如果您想匹配子包,您应该使用
net.prc.sales.web.controller.*
而不是
net.prc.sales.web.controller.*
。但这不是您的问题,因为示例代码显示class
CustomerInfoController
就在该包中

此外,你需要

  • 在切入点的方法签名中指定返回类型
  • 为注释指定完全限定的类名,并
  • 确保您的通知的返回类型与拦截的方法的类型匹配。如果截获的方法返回其他内容(在您的示例中,
    ModelAndView
    ),则您的建议不能返回void
我还建议重新抛出捕获的
可丢弃的
,而不仅仅是吞下它

试着这样做:

@Around(“执行(*net.prc.sales.web.controller.*(…))&&@注释(net.prc.foo.bar.RequestMapping)”)
公共对象ourAroundAdvice(处理连接点thisJoinPoint)抛出可丢弃{
System.out.println(“在”+此连接点之前);
对象结果=空;
试一试{
结果=此连接点。继续();
System.out.println(“返回后”+此连接点);
返回结果;
}捕获(可丢弃的t){
System.out.println(“抛出后”+此连接点);
掷t;
}
}
我的建议是在做复杂的事情之前先学习AspectJ基础知识。您可以使用本机语法而不是注释样式,因为Eclipse通过语法突出显示和错误消息为您提供了良好的反馈。然后,如果您已经准备好了切入点,以后仍然可以将其转换为@AspectJ语法


更新:至于将注释绑定到advice参数以便能够访问其属性,也可以这样做,我刚刚阅读了您问题的这一部分。首先执行通知,然后在此处继续(代码未测试):

@Around(“执行(*net.prc.sales.web.controller.*(…))&&@注释(请求映射)”
公共对象ourAroundAdvice(ProceedingJoinPoint thisJoinPoint,RequestMapping RequestMapping)抛出Throwable{
System.out.println(“在”+此连接点之前);
System.out.println(“Request method=“+requestMapping.method());
System.out.println(“请求值=“+requestMapping.value());
对象结果=空;
试一试{
结果=此连接点。继续();
System.out.println(“返回后”+此连接点);
返回结果;
}捕获(可丢弃的t){
System.out.println(“抛出后”+此连接点);
掷t;
}
}

控制器是不是应该是控制器?另外,如果您想拦截所有请求,您可能想看看HandlerInterceptors(),它允许您对特定URL的请求进行预处理和后处理必须检查—您是否将spring aop作为依赖项?您是否启用了aop:aspectj autoproxy?您使用的是JDK还是CGlib代理?如果您使用的是JDK代理,那么应该使用接口()是的,我启用了aspectJ autoproxy。在@kriegaex-answer上对我有用。谢谢非常感谢你。在切入点中进行了如下细微调整后,它对我起了作用:@Around(“execution(*net.prcins.esales.web.controller…*(…)&&@annotation(org.springframework.web.bind.annotation.RequestMapping)”)是的,在第一个示例中,我刚刚发明了一个包名(“foo.bar”),因为我不知道您的注释的真实包名。在第二个示例中,我假设参数绑定注释是在方面中导入的,因此是缩写形式。是的,我只需要在切入点中添加执行字。我同意关于软件包的事情,我不是故意说软件包。天哪,那是一个复制粘贴错误,我现在要修复它。这就是为什么只编写而不编译和运行示例代码是个坏主意。