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



我有一个使用Spring 3的web应用程序,其中控制器用@Controller注释。控制器的公共方法用@RequestMapping进行注释。这非常好用。

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

<aop:aspectj-autoproxy>
    <aop:include name="myAspect"/>
</aop:aspectj-autoproxy>

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

"没有用于处理程序XXX的适配器:您的处理程序是否实现了像Controller这样的受支持接口?">

因此控制器不再工作。有人知道如何解决这个问题吗?

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

来自春季参考:

可以强制使用CGLIB,在这些情况下(希望是罕见的(你需要建议一种方法未在接口上声明,或者在那里你需要通过代理对象作为具体类型。

http://static.springsource.org/spring/docs/3.0.x/reference/aop.html#aop-自动代理力CGLIB

强制使用CGLIB代理集代理目标类的值<aop:config>的属性元素为真:<aop:config proxy-target-class="true">

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

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

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

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

最新更新