界面打开报404错误

时间:2025-03-20 19:08:02
  • 很容易找到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会引入它,那找一下哪里使用了这个注解,接着就找到了项目里面使用它的地方,注释掉,一访问就正常了