前题:拷贝已有的项目,删除多余的配置文件,然后启动项目。
问题:访问路径时始终返回404。
解决方案:把包扫描的两个配置写在一起!
<context:component-scan base-package="com.pro" />
<mvc:annotation-driven />
确定了web中的dispatch配置、spring的context:component-scan、Controller的注入类引用是否正确。因为这些配置比较普遍,就那么几个单词,但是怎么都不对,非常不明白,为什么就是不行。
百度了很多,这里吐槽一下百度,搜出来都是一样的东西。
接下来就只能自己调试了。先打断点,确定在项目启动的时候加载了Controller,但是看控制台输出没有加载方法。
然后从dispatch开始调试,发现AbstractHandlerMethodMapping中的registerHandlerMethod方法没有执行。因此确定是扫描包配置出了问题。
DispatcherServlet 继承FrameworkServlet,通过FrameworkServlet的doGet方法,执行doService方法,DispatcherServlet中doDispatch方法中调用getHandler方法=>getHandlerExecutionChain方法=>getLookupPathForRequest方法:
getLookupPathForRequest中在这里获取是否有项目中可以跳转的路径:
List<T> directPathMatches = this.urlMap.get(lookupPath);
而urlMap是一个final变量:
private final MultiValueMap<String, T> urlMap = new LinkedMultiValueMap<String, T>();
因此搜索到给urlMap添加值的方法:registerHandlerMethod
但是这个方法却没有执行,因此肯定配置有问题,重新找了一遍,推测了一下,原本的配置是包扫描放在Application中,注入放在另外一个文件中,决定把包扫描的两个配置写在一起。再次重启项目,居然成功了!
<context:component-scan base-package="com.pro" />
<mvc:annotation-driven />