很容易找到WebMvcConfigurationSupport
,找到#resourceHandlerMapping
,该方法会通过#getHandlerMapping
获得一个SimpleUrlHandlerMapping
但是在getHandlerMapping
方法中发现,资源处理器注册中心(ResourceHandlerRegistry
)需要注册了资源处理器才会有SimpleUrlHandlerMapping
实例化
protected AbstractHandlerMapping getHandlerMapping() {
if (this.registrations.isEmpty()) {
return null;
}
...
SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
handlerMapping.setOrder(order);
handlerMapping.setUrlMap(urlMap);
return handlerMapping;
}
而注册资源处理器的动作是在#resourceHandlerMapping
里面的addResourceHandlers(registry)
这个步骤中
到这里可以知道,WebMvcConfigurationSupport
是配置资源处理器的地方
回到addResourceHandlers(registry)
,发现这个方法是给子类实现的,DelegatingWebMvcConfiguration
实现了它,相当于把注册的工作交给了DelegatingWebMvcConfiguration
,从名称可以看出,它也不干活,只做委托的动作,委托给了它的成员变量WebMvcConfigurerComposite
,注意这个composite
,说明有很多WebMvcConfigurer
所以,注册的动作最终还是由实现了WebMvcConfigurer
接口的实例来实现的,这些实例当中肯定有注册资源处理器的,现在的项目中肯定就是缺少这个实例
查看WebMvcConfigurer
的实现,发现了WebMvcAutoConfigurationAdapter
,这是springboot里的自动装配,而且它有addResourceHandlers
的实现,可能需要它,那接下来就要看这个自动装配为啥没有生效了
来看看生效的条件,因为WebMvcAutoConfigurationAdapter
是一个嵌套的配置,所以看它的依附类WebMvcAutoConfiguration
的一个条件:@ConditionalOnMissingBean()
,可能就是WebMvcConfigurationSupport
的实例存在,才导致自动装配失效
那么,检查一下WebMvcConfigurationSupport
是怎么实例化的,发现@EnableWebMvc
会引入它,那找一下哪里使用了这个注解,接着就找到了项目里面使用它的地方,注释掉,一访问就正常了