2011-04-07 49 views
2

我有一个使用Spring 3的Web应用程序,其中控制器用@Controller注释。控制器的公共方法用@RequestMapping注释。这工作非常好。在@Controller方法上使用@Before方面与Spring不起作用

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

​​

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

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

所以控制器不再工作。有没有人有如何解决这个问题的想法?

回答

4

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

从Spring参考:

有可能会强制使用 CGLIB,在这种情况(希望不常有)下 ,你需要通知 没有在接口中声明的方法,或 ,您需要将代理的 对象作为具体类型传递给方法。

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

要强制使用CGLIB代理的设置 的<aop:config> 元件的代理目标级 属性的值设定为真:<aop:config proxy-target-class="true">

要强制CGLIB使用@AspectJ自动代理支持代理时,设置 '代理目标类'属性 <aop:aspectj-autoproxy>元 为true:<aop:aspectj-autoproxy proxy-target-class="true"/>

BTW:我建议用AspectJ代替或者Spring代理cgilib的AOP。/

4

注意
使用控制器接口 (如AOP代理),确保 一贯把你所有的映射 注释 - 在 控制器接口上- 如@RequestMapping@SessionAttributes而不是 的实现类。

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

+0

控制器(实现)类没有实现任何接口,它们只用@Controller注释。 – Tore 2011-04-07 09:32:14

+0

+1用于识别问题 – Ralph 2011-04-07 12:28:22