写在前面
本文是基于Spring boot 1.5.21版本 ;
问题是来源于一个简单的spring boot 项目。参照spring boot 文档部署的web 项目,本身在访问静态资源按照默认配置访问即可,是不会有什么问题的。但我没有注意到的是 这个spring boot 项目集成了 swagger ,这就导致它重写了 spring 的默认配置。
问题的解决方法 ,非常简单,可对于spring boot 部署web项目的真正处理逻辑,还是不明觉厉啊。所以特查找了资料写下此文,防止以后再入坑。
如果你只是想寻找答案,此文可能不适合你额 …
spring boot 部署 web 应用程序 之 静态内容
默认情况下,spring boot 提供的静态内容来自于类路径下的
/static
( or/public
or/resources
or/META-INF/resources
) 目录,或者来自于ServletContext
的根目录。
- 如果你想使用自己的目录来提供静态内容,可以使用 来自 Spring MVC 的
ResourceHttpRequestHandler
, 通过添加你自己的WebMvcConfigurerAdapter
并 重载addResourceHandlers
方法。 swagger 的配置便是如此:
@Configuration @EnableSwagger2 @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html**") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); // 这里是我解决“写在前面“所遇见的问题 registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/"); } @Bean public Docket buildDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(buildApiInf()) .select() //controller路径 .apis(RequestHandlerSelectors.basePackage("com")) .paths(PathSelectors.any()) .build(); } private ApiInfo buildApiInf() { return new ApiInfoBuilder() .title("接口列表") .termsOfServiceUrl("http://127.0.0.1:8080/swagger-ui.html") .description("springmvc swagger 接口测试") .version("1.0.0") .build(); } }
灵魂疑问:ResourceHttpRequestHandler
与
WebMvcConfigurerAdapter` 的关系是什么?
- 在独立的web 程序中, 默认的 容器里的默认的 servlet 已经被启用,充当预备计划。也就是说当 Spring 不能够处理时,将提供来自
ServletContext
根目录下的内容。这种情况不会经常发生,除非你修改了默认的 MVC 配置。Spring MVC 总是能够通过DispatcherServlet
处理请求。注:默认 Servlet 是配置在
$catalina/conf/web.xml
里的。当未匹配到任何的 servlet 时, 就会由默认的 servlet 处理;ServletContext
根目录对应WebRoot ()
- 默认情况下, 资源映射在 /** 上,但是可以通过
spring.mvc.static-path-pattern
对其进行调优,例如,将所有资源重新定位到 /resources/** 下:
spring.mvc.static-path-pattern=/resources/**
也可以自定义资源路径,通过使用
spring.resources.static-locations
(这将替代默认的路径)。这和1中所提的重载addResourceHandlers
所起的作用是一样的(当重载addResourceHandlers
,当前的这种配置不生效 )。
除了上面的“标准”静态资源位置之外,webjar内容还有一个特殊的情况。如果以webjar格式打包,那么/webjars/**中有路径的任何资源都将从jar文件中提供。(参考 swagger 配置)
注:如果您的应用程序将打包为jar,那么不要使用src/main/webapp目录。虽然这个目录是一个通用的标准,但是它只适用于war打包,如果您生成一个jar,那么大多数构建工具都会忽略它。
更多高级功能,参考推荐博文中的官方文档。
挖的深度还是浅了点,后续再补充
推荐博文
参考博文