SpringMVC在Controller实现BeanFactoryAware接口后,请求响应405初步解决以及分析

    首先介绍BeanFactoryAware使用背景,该接口的功能是为了在Controller内使用beanFactory,这涉及到另外的内容不赘述。


初步的代码是如上图所示。在使用postman测试接口时,响应码405。

    在检查配置和编码后,一度让我以为controller只能是pojo类。初步猜测是BeanFactoryAware接口改变了Controller的加载时机,莫名其妙加@EnableAspectJAutoProxy(proxyTargetClass = true)解决了该问题,具体原因没有深究。后续仔细看了一篇博客对springmvc的流程分析,点击打开链接。个人理解是mvc中的处理器映射器返回handler时改变了映射结果,或者在映射器适配器匹配URI时找不到请求携带的URI,和类加载时机无关。同时又看到了一篇对Java代理模式分析的博客,点击打开链接。按照我的理解Springmvc的handler其实不是对controller这个类进行完全的映射,更像是对controller的方法进行映射,所以我大胆猜测,HandlerMapping在映射过程是对controller方法的增强,而且是使用cglib的方式,而实现了接口的controller,在映射时错误的使用了动态代理,导致找不到URI响应405。接着Debug印证我的猜想,直接上图。

    分情况测试,根据SpringMVC流程,直接定位到org.springframework.web.servlet.handler.AbstractHandlerMapping代码的298行断点,这里返回的是handller。

第一种,实现BeanFactoryAware接口的controller

直接请求进入Debug,可以看到handler的属性,如下图

可以很清楚的看到handler本质是HandlerMethod类,在org.springframework.web.method包下,感兴趣的朋友可以自己读一下源码。同时代理方式是动态代理。

第二种,作为对比,再比较一下加了@EnableAspectJAutoProxy(proxyTargetClass = true)注解后的controller

可以明显看出,代理方式改变。

第三种,pojo类controller,去掉controller的接口。


以上是spring3.2.13版本的内容,可以明显的看出代理的改变。其实就我各种情况测试,也不是每个controller加接口都是会出现405这样报错。而且,spring4.3.14版本,进入Debug也看不到以上信息。如下图

很有可能,Spring 4改变了handler的映射模式,至少我追溯源码时按照Spring 3的方式Debug已经看不到相关信息。同时在Spring4各种测试,我也没有再遇到加接口请求405的情况(也许是SpringMVC 3的BUG,更新后修复了)。

引用两位前辈的博客作参考,如有侵权,请及时联系我,同时如有对这篇博客内容有异议,欢迎讨论交流。

最后总结,如果在使用SpringMVC 3的过程中遇到controller实现接口时请求405,那么可以尝试加上@EnableAspectJAutoProxy(proxyTargetClass = true)注解,手动改变代理模式。

        








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值