【问题标题】:Spring 3 MVC @Controller with AOP interceptors?Spring 3 MVC @Controller 与 AOP 拦截器?
【发布时间】:2023-03-17 00:39:01
【问题描述】:

任何人都知道为什么显然不可能将 AOP 与带注释的 MVC 控制器一起使用? (见Post)。 我有一个@Controller,一旦我添加一个切入点,它就会停止工作。 问题不在于没有调用拦截器,而是@Controller 只是停止工作(在日志中,您可以看到“映射的 URL 路径 [/xx] 到处理程序'Yyy'”而不是“没有 URL已识别的路径”)。

我知道有一种机制可以通过 handlerMapping 向控制器添加拦截器,但我的问题是针对 AOP 拦截器的。带注释的控制器不只是 Spring 容器中的 pojo 和任何其他 pojo 一样吗?有什么区别?为什么?

@Controller
@RequestMapping("/user")
public class RestTestImpl implements RestTest {
    @RequestMapping(value="/", method={RequestMethod.GET})
    public @ResponseBody String deleteUsers(String arg) {
        return "Xxxxx";
    }
}

在我的 servlet-Context 中,我有:

<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)!

【问题讨论】:

    标签: java spring spring-mvc controller spring-aop


    【解决方案1】:

    来自Spring MVC Reference

    注意
    使用控制器接口时(例如,用于 AOP 代理), 确保始终将您的所有 映射注释 - 例如 @RequestMapping@SessionAttributes - 在控制器接口上而不是在实现类上。

    当然,这个注释隐藏得很好:-)

    【讨论】:

    • 太好了,非常感谢。而已。通常建议将注释放在实现类而不是接口中,但在这种情况下,这似乎是要走的路。谢谢。
    • @pakman 通常需要注释实现类,因为注释不是从接口继承的,但是控制器注释逻辑在运行时在实际 bean 上工作(可能是代理),而不是静态 bean 类
    • @SeanPatrickFloyd 你能在这里检查我的问题吗:stackoverflow.com/questions/8234059/…
    【解决方案2】:

    我遇到了同样的问题并找到了解决方案。

    确实,您的控制器(由@Controller 注释)和您的方面(由@Aspect 注释)应该在相同的 Spring 上下文中。

    通常人们在 dispatch-servlet.xmlxxx-servlet.xml 中定义他们的控制器,在主 中定义他们的服务 bean(包括方面) applicationContext.xml。它不会起作用。

    当 Spring 初始化 MVC 上下文时,它会为你的控制器创建一个代理,但如果你的切面不在同一个上下文中,Spring 不会为它们创建拦截器。

    上面的ssertion不依赖

    • 在声明控制器/方面的过程中(通过手动 XML 声明或注释样式)
    • 关于您选择的代理方式(JDK 代理或 CGLIB)

    我已经测试了所有的组合,只要控制器和方面在相同的 Spring 上下文中

    ,它们都可以工作

    【讨论】:

    • Ty,遇到了同样的问题... :)
    【解决方案3】:

    我最好的猜测没有做一些认真的挖掘是因为你正在使用的 Spring 的 AOP 机制是将目标类包装在代理类中,这最终会丢失它们的注释或原始注释在编织后被丢弃。

    我确信有更好的答案,我会扩展我的答案,因为我想到了一种更好更清晰的方式来呈现它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多