在Spring上使用@Before方面对@Controller方法不起作用

时间:2011-04-07 08:47:00

标签: java spring spring-mvc spring-aop

我有一个使用Spring 3的Web应用程序,其中控制器使用@Controller注释。控制器的公共方法使用@RequestMapping进行注释。这完全没问题。

现在我想在调用控制器中的任何公共方法之前进行检查。我使用Pointcut表达式创建了@Before方面,该表达式选择了使用@RequestMapping注释的所有控制器方法。我已经使用

注册了这个方面
<aop:aspectj-autoproxy>
    <aop:include name="myAspect"/>
</aop:aspectj-autoproxy>

问题在于,当我启动应用程序并请求由我的某个控制器处理的某些URL时,我收到以下错误消息:

“处理程序XXX没有适配器:您的处理程序是否实现了受控制的接口,如Controller?”

所以控制器不再工作了。有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

  

注意
   使用控制器接口时   (例如,对于AOP代理),请确保   始终放置所有映射   注释 - 例如@RequestMapping   和@SessionAttributes -   控制器接口而不是on   实施类。

来源: Spring Reference > Web MVC Framework > Implementing Controllers

答案 1 :(得分:4)

肖恩帕特里克弗洛伊德是对的。还有另一种方法:将Spring Proxy AOP切换到CGILib。

来自Spring Reference:

  

可以强制使用   CGLIB,在那些(希望是罕见的)案件中   你需要建议一个方法   未在接口上声明,或   你需要通过代理的地方   将对象作为具体类型的对象。

http://static.springsource.org/spring/docs/3.0.x/reference/aop.html#aop-autoproxy-force-CGLIB

  

强制使用CGLIB代理集   proxy-target-class的值   <aop:config>的属性   element为true:<aop:config proxy-target-class="true">

     

要在使用@AspectJ autoproxy支持时强制CGLIB代理,请设置   'proxy-target-class'属性   <aop:aspectj-autoproxy>元素   为真:<aop:aspectj-autoproxy proxy-target-class="true"/>

BTW:我建议使用AspectJ或Spring Proxy CGILib AOP。 /