我有一个使用Spring 3的Web应用程序,其中控制器使用@Controller注释。控制器的公共方法使用@RequestMapping进行注释。这完全没问题。
现在我想在调用控制器中的任何公共方法之前进行检查。我使用Pointcut表达式创建了@Before方面,该表达式选择了使用@RequestMapping注释的所有控制器方法。我已经使用
注册了这个方面<aop:aspectj-autoproxy>
<aop:include name="myAspect"/>
</aop:aspectj-autoproxy>
问题在于,当我启动应用程序并请求由我的某个控制器处理的某些URL时,我收到以下错误消息:
“处理程序XXX没有适配器:您的处理程序是否实现了受控制的接口,如Controller?”
所以控制器不再工作了。有没有人知道如何解决这个问题?
答案 0 :(得分:4)
注意强>
使用控制器接口时 (例如,对于AOP代理),请确保 始终放置所有映射 注释 - 例如@RequestMapping
和@SessionAttributes
- 控制器接口而不是on 实施类。
来源: Spring Reference > Web MVC Framework > Implementing Controllers
答案 1 :(得分:4)
来自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。 /