Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring3MVC@Controller与AOP拦截器?_Java_Spring_Spring Mvc_Controller_Spring Aop - Fatal编程技术网

Java Spring3MVC@Controller与AOP拦截器?

Java Spring3MVC@Controller与AOP拦截器?,java,spring,spring-mvc,controller,spring-aop,Java,Spring,Spring Mvc,Controller,Spring Aop,有人知道为什么不能将AOP与带注释的MVC控制器一起使用吗?(见附件)。 我有一个@Controller,一旦我添加切入点,它就会停止工作。 问题不在于没有调用拦截器,而在于@Controller只是停止了工作(在日志中,您可以看到不是“将URL路径[/xx]映射到处理程序'Yyy'”,而是“没有识别URL路径”) 我知道有一种通过handlerMapping向控制器添加拦截器的机制,但我的问题是针对AOP拦截器的。带注释的控制器不只是Spring容器中的pojo吗?有什么区别?为什么? @Co

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

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

@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的AOP机制是将目标类包装在代理类中,代理类最终会丢失它们的注释,或者在编织之后删除原始注释

我相信会有更好的答案,我将进一步阐述我的答案,因为我想到了一种更好、更清晰的表达方式。

来自:

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


诚然,这张便条隐藏得很好:-)

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

实际上,您的控制器(由@controller注释)和方面(由@Aspect注释)应该位于相同的Spring上下文中

通常人们在dispatch servlet.xmlxxx servlet.xml中定义他们的控制器,并在主applicationContext.xml中定义他们的服务bean(包括方面)。这是行不通的

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

上述部分不取决于

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

我已经测试了所有的组合,只要控制器和方面在相同的Spring上下文中,它们都能工作,非常感谢。就这样。通常建议在实现类而不是接口中放置注释,但在这种情况下,这似乎是一种方法。谢谢。@pakman通常需要对实现类进行注释,因为注释不是从接口继承的,但是控制器注释逻辑在运行时作用于实际bean(可能是代理),而不是静态beanclass@SeanPatrickFloyd你能检查一下我的问题吗:泰,有同样的问题……:)