我们开发了一个基于SpringBoot的工具(starter封装),可以提供通用的功能和管理页面。为了让这些页面能够在不同的SpringBoot项目中使用,我们采用了一种叫做webjars的技术,将页面的静态资源(如JavaScript和CSS文件)存放在一个公共的地方。但是有些项目访问这些资源时可能会遇到404错误的问题,无法正常显示页面。
首先springboot默认提供包括static webjars的资源解析的。这个是默认的mvc配置提供。因此检查出现404的项目的所有mvc配置是否有被调整。
发现该项目存在跨域配置. 是通过WebMvcConfigurationSupport继承实现
@Configuration
public class AppConfig extends WebMvcConfigurationSupport {/*** 统一处理跨域问题*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "DELETE", "PUT").allowCredentials(true).maxAge(3600);}
}

静态资源解析失效,因为是覆盖默认mvc配置,那么。直接补充就好
@Configuration
public class AppConfig extends WebMvcConfigurationSupport {/*** 统一处理跨域问题*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "DELETE", "PUT").allowCredentials(true).maxAge(3600);}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 解决静态资源无法访问的问题registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}
虽然能解决问题,WebMvcConfigurationSupport但是这种方式不太好,以后还有可能其他默认行为被覆盖,还得补。
实现WebMvcConfigurer接口,只会覆盖实现接口逻辑。springboot默认的mvc配置不会被改变
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {/** 跨域支持*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE").allowCredentials(true).allowedHeaders("*").maxAge(3600);}
}
springboot项目中想要调整mvc配置.尽量通过实现WebMvcConfigurer 接口实现。直接继承WebMvcConfigurationSupport会,导致默认处理失效。