Spring 3 MVC @Controller与AOP拦截器?
任何人都知道为什么显然无法将AOP与带注释的MVC控制器一起使用吗?我有一个@Controller,一旦添加切入点,它就会停止工作。问题不在于没有调用拦截器,而是@Controller只是停止工作(在日志中,你可以看到“没有URL而不是“将URL路径[/ xx]映射到处理程序’Yyy””)确定的路径”)。
我知道有一种通过handlerMapping将拦截器添加到控制器的机制,但是我的问题特定于AOP拦截器。注释控制器不是像其他pojo一样只是在Spring容器中注释pojos吗?有什么不同?为什么?
@Controller
@RequestMapping("/user")
public class RestTestImpl implements RestTest {
@RequestMapping(value="/", method={RequestMethod.GET})
public @ResponseBody String deleteUsers(String arg) {
return "Xxxxx";
}
}
在我的Servlet上下文中,我有:
<context:component-scan base-package="org.xxx.yyy"></context:component-scan>
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
. . .
</bean>
但是当我添加:
<aop:config>
<aop:pointcut expression="execution(* org.xxx.*(..))" id="pc1"/>
<aop:advisor advice-ref="hibernateInterceptor" pointcut-ref="pc1" order="2" />
</aop:config>
控制器不再是控制器(没有错误,只是它停止绑定到指定的URL)!
-
从Spring MVC参考:
注意
使用控制器接口时(例如,用于AOP代理),请确保始终将所有映射注释(例如@RequestMapping
和@SessionAttributes
)放在控制器接口上而不是在实现类上。当然,此注释已很好隐藏:-)
-
我遇到了同样的问题,并找到了解决方案。
实际上,你的控制器(由@Controller注释)和方面(由@Aspect注释)应该在同一Spring上下文中。
通常,人们在主要的applicationContext.xml中的dispatch-servlet.xml或xxx-servlet.xml中定义他们的控制器,并在主要applicationContext.xml中定义他们的服务bean(包括方面)。不起作用。
当Spring初始化MVC上下文时,它将为你的控制器创建一个代理,但是如果你的方面不在同一上下文中,则Spring将不会为其创建拦截器。
上面的内容不取决于
- 在声明控制器/方面的方式上(通过手动XML声明或注释样式)
- 根据你选择的代理样式(JDK代理或CGLIB)
我已经测试了所有组合,并且只要控制器和方面都在同一Spring上下文中,它们都可以工作
-
Spring MVC 3:拦截器返回错误的视图
2021-02-02 关注 0 浏览82 1答案
-
Spring MVC拦截器映射问题
2021-02-02 关注 0 浏览80 1答案
-
Spring MVC中的拦截器
2021-02-02 关注 0 浏览87 1答案
-
Spring MVC处理程序拦截器未运行
2021-02-02 关注 0 浏览84 1答案
-
请问Struts拦截器和Spring AOP有什么区别?
2020-01-28 关注 0 浏览682 1答案
-
spring 3拦截器顺序
2021-02-02 关注 0 浏览97 1答案
-
如何在Spring MVC拦截器中验证会话
2021-02-02 关注 0 浏览165 1答案
-
Spring MVC从拦截器获取映射控制器方法
2021-02-02 关注 0 浏览173 1答案
-
如何使用Spring MVC拦截器更改发布的值
2021-02-02 关注 0 浏览95 1答案
-
是否可以使用注释连接Spring MVC拦截器?
2021-02-02 关注 0 浏览90 1答案