问题场景:使用springboot2.1.3集成thymeleaf之后static下的静态资源无法访问

在网上百度之后采取了以下几种方式:
1.在application.properties文件中添加如下配置,意思就是把static下的文件访问都映射到locations指定的文件目录下
#以什么样的路径访问静态资源
spring.mvc.static-path-pattern=/static/**
#在何处查找静态资源
spring.resources.static-locations=classpath:/templates/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
2.用代码重写springMVC的资源处理器。因为WebMvcConfigurerAdapter已经过时了,百度很多人说可以用WebMvcConfigurationSupport来代替,就写了以下代码来测试
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
/**
* 资源处理器
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
logger.info("addResourceHandlers");
//将所有/static/**访问都映射到classpath:/static/目录下
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
}发现还是访问不到静态资源,查资料发现
WebMvc的自动配置都在WebMvcAutoConfiguration类中
@Configuration
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
public static final String DEFAULT_PREFIX = "";
public static final String DEFAULT_SUFFIX = "";
private static final String[] SERVLET_LOCATIONS = new String[]{"/"};
public WebMvcAutoConfiguration() {
}
@Configuration
@ConditionalOnWebApplication(
type = Type.SERVLET
)
但是类中有@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})这个注解,这个注解的意思是一旦在容器中检测到WebMvcConfigurationSupport这个类,WebMvcAutoConfiguration类中的配置就都不生效,只有在我们的的容器中没有这个组件的时候,自动配置类才会生效。所以一旦我们自己写的配置类继承了WebMvcConfigurationSupport,就相当于我们的容器中已经导入了WebMvcConfigurationSupport这个组件,所以默认配置都不会生效,都得自己在配置文件中配置。
通过以上两种方式都没有得到解决,查了一上午资料(好吧,我很菜)找到了解决方案:实现WebMvcConfigurer接口

public class WebMvcConfig implements WebMvcConfigurer{
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
UserArgumentResolver userArgumentResolver;
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(userArgumentResolver);
}
public void addResourceHandlers(ResourceHandlerRegistry registry) {
logger.info("addResourceHandlers");
//将所有/static/**访问都映射到classpath:/static/目录下
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
}ok,终于能够访问了!

版权声明:本文为xiaozheng12原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。