springboot无法加载空的静态资源文件

现象描述

今天在更新web应用之后发现有个页面加载不出来了,打开调试页面发现是一个css文件无法加载,如图:在这里插入图片描述
可是其它静态文件的加载都是OK的,难道是打包没有打包进去?!于是尝试把web应用的jar包解压,发现该文件其实是存在的,只不过该文件的大小为0。手动把前端代码重新打包,确实看到生成了大小为0的3个css文件,见图:在这里插入图片描述
这又是为何呢?之前这个应用部署后该功能是可用的,于是把之前可用的jar包解压后发现里面也存在着大小为0的css文件,而且不打包编译部署,在本地直接运行也是OK的,这就更是奇怪了~~

问题追踪

1. 为什么会编译生成大小为0的css文件?

这个稍微想一下其实就找到原因了:我们前端用的vue框架来实现的,在使用IDE自动生成vue文件模板的时候会默认包含html部分、script部分以及style部分,有时候该vue文件并不需要定义特殊的样式,所以style这部分就为空了,偷懒也没有删掉,如图:在这里插入图片描述
这种情况用npm build打包编译之后就会生成一些空的css文件。

2. 为什么大小为0的css文件加载会报错?

这个就有点儿百思不得其解了,于是一番stackoverflow,发现也有人有类似的问题,见:https://stackoverflow.com/questions/63562654/spring-boot-not-serving-empty-zero-byte-static-assets
既然是springboot自身机制的原因,那为啥我之前可以嘞? 哦,我之前的版本使用的maven进行的编译,其中springboot的版本是2.2.5,而现在使用gradle以后,使用的版本换成了2.4.1。
这个问题其实在springframework的github上也有人提issue,但看了半天也没看出个所以然了,貌似大家就认为应该是这样的。
如果是版本的问题,那为什么本地直接运行是OK的呢??

解决办法

  1. 似乎把springboot的版本回退回去能解决问题,但这个有点儿得不偿失,放着新版本不用再回退到旧的版本。。
  2. 老老实实在前端代码里把为空的样式部分删掉,然后重新编译,事实上我也是这么干的,确实可行,只是找这些为空的文件费了一点儿时间。。
  3. 是不是webpack在打包前端代码的时候自动检测,不生成空的css文件呢? 找了一圈也没找到合适的办法,如果有朋友知道这种方法怎么搞,欢迎留言讨论~~
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录结构 尚硅谷_SpringBoot_入门-课程简介 尚硅谷_SpringBoot_入门-Spring Boot简介 尚硅谷_SpringBoot_入门-微服务简介 尚硅谷_SpringBoot_入门-环境准备 尚硅谷_SpringBoot_入门-springboot-helloworld 尚硅谷_SpringBoot_入门-HelloWorld细节-场景启动器(starter) 尚硅谷_SpringBoot_入门-HelloWorld细节-自动配置 尚硅谷_SpringBoot_入门-使用向导快速创建Spring Boot应用 尚硅谷_SpringBoot_配置-yaml简介 尚硅谷_SpringBoot_配置-yaml语法 尚硅谷_SpringBoot_配置-yaml配置文件值获取 尚硅谷_SpringBoot_配置-properties配置文件编码问题 尚硅谷_SpringBoot_配置-@ConfigurationProperties与@Value区别 尚硅谷_SpringBoot_配置-@PropertySource、@ImportResource、@Bean 尚硅谷_SpringBoot_配置-配置文件占位符 尚硅谷_SpringBoot_配置-Profile多环境支持 尚硅谷_SpringBoot_配置-配置文件位置 尚硅谷_SpringBoot_配置-外部配置顺序 尚硅谷_SpringBoot_配置-自动配置原理 尚硅谷_SpringBoot_配置-@Conditional&自动配置报告 尚硅谷_SpringBoot_日志-日志框架分类和选择 尚硅谷_SpringBoot_日志-slf4j使用原理 尚硅谷_SpringBoot_日志-其他日志框架统一转换为slf4j 尚硅谷_SpringBoot_日志-SpringBoot日志关系 尚硅谷_SpringBoot_日志-SpringBoot默认配置 尚硅谷_SpringBoot_日志-指定日志文件和日志Profile功能 尚硅谷_SpringBoot_日志-切换日志框架 尚硅谷_SpringBoot_web开发-简介 尚硅谷_SpringBoot_web开发-webjars&静态资源映射规则 尚硅谷_SpringBoot_web开发-引入thymeleaf 尚硅谷_SpringBoot_web开发-thymeleaf语法 尚硅谷_SpringBoot_web开发-SpringMVC自动配置原理 尚硅谷_SpringBoot_web开发-扩展与全面接管SpringMVC 尚硅谷_SpringBoot_web开发-【实验】-引入资源 尚硅谷_SpringBoot_web开发-【实验】-国际化 尚硅谷_SpringBoot_web开发-【实验】-登陆&拦截器 尚硅谷_SpringBoot_web开发-【实验】-Restful实验要求 尚硅谷_SpringBoot_web开发-【实验】-员工列表-公共页抽取 尚硅谷_SpringBoot_web开发-【实验】-员工列表-链接高亮&列表完成 尚硅谷_SpringBoot_web开发-【实验】-员工添-来到添页面 尚硅谷_SpringBoot_web开发-【实验】-员工添-添完成 尚硅谷_SpringBoot_web开发-【实验】-员工修改-重用页面&修改完成 尚硅谷_SpringBoot_web开发-【实验】-员工删除-删除完成 尚硅谷_SpringBoot_web开发-错误处理原理&定制错误页面 尚硅谷_SpringBoot_web开发-定制错误数据 尚硅谷_SpringBoot_web开发-嵌入式Servlet容器配置修改 尚硅谷_SpringBoot_web开发-注册servlet三大组件 尚硅谷_SpringBoot_web开发-切换其他嵌入式Servlet容器 尚硅谷_SpringBoot_web开发-嵌入式Servlet容器自动配置原理 尚硅谷_SpringBoot_web开发-嵌入式Servlet容器启动原理 尚硅谷_SpringBoot_web开发-使用外部Servlet容器&JSP;支持 尚硅谷_SpringBoot_web开发-外部Servlet容器启动SpringBoot应用原理 尚硅谷_SpringBoot_Docker-简介 尚硅谷_SpringBoot_Docker-核心概念 尚硅谷_SpringBoot_Docker-linux环境准备 尚硅谷_SpringBoot_Docker-docker安装&启动&停止 尚硅谷_SpringBoot_Docker-docker镜像操作常用命令 尚硅谷_SpringBoot_Docker-docker容器操作常用命令 尚硅谷_SpringBoot_Docker-docker安装MySQL 尚硅谷_SpringBoot_数据访问-简介 尚硅谷_SpringBoot_数据访问-JDBC&自动配置原理 尚硅谷_SpringBoot_数据访问-整合Druid&配置数据源监控 尚硅谷_SpringBoot_数据访问-整合MyBatis(一)-基础环境搭建 尚硅谷_SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis 尚硅谷_SpringBoot_数据访问-整合MyBatis(二)-配置版MyBatis 尚硅谷_SpringBoot_数据访问-SpringData JPA简介 尚硅谷_SpringBoot_数据访问-整合JPA 尚硅谷_SpringBoot_原理-第一步:创建SpringApplication 尚硅谷_SpringBoot_原理-第二步:启动应用 尚硅谷_SpringBoot_原理-事件监听机制相关测试 尚硅谷_SpringBoot_原理-自定义starter 尚硅谷_SpringBoot_结束语
Spring Boot 静态资源默认是放在 `/static`,`/public`,`/resources`,`/META-INF/resources` 目录下的,这些资源在应用启动时会被到内存中供访问。如果需要动态静态资源,可以使用 `ResourceHttpRequestHandler`。 下面是一个简单示例: 1. 创建 `DynamicResourceController` 控制器类,该类负责动态静态资源: ```java @Controller public class DynamicResourceController { @Autowired private ResourceLoader resourceLoader; @RequestMapping("/dynamic/**") public ResponseEntity<Resource> getDynamicResource(HttpServletRequest request) throws IOException { String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); String bestMatchingPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); AntPathMatcher apm = new AntPathMatcher(); String relativePath = apm.extractPathWithinPattern(bestMatchingPattern, path); Resource resource = resourceLoader.getResource("classpath:dynamic/" + relativePath); if (!resource.exists()) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } return ResponseEntity.ok(resource); } } ``` 2. 在 `application.properties` 中配置静态资源路径: ``` spring.mvc.static-path-pattern=/static/** ``` 3. 在 `WebMvcConfigurer` 中注册 `ResourceHttpRequestHandler`: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); registry.addResourceHandler("/dynamic/**") .addResourceLocations("classpath:/dynamic/") .resourceChain(false) .addResolver(new PathResourceResolver() { @Override protected Resource getResource(String resourcePath, Resource location) throws IOException { Resource requestedResource = location.createRelative(resourcePath); if (requestedResource.exists() && requestedResource.isReadable()) { return requestedResource; } else if (resourcePath.contains(".")) { String pathPrefix = resourcePath.substring(0, resourcePath.lastIndexOf(".")); String pathSuffix = resourcePath.substring(resourcePath.lastIndexOf(".")); Resource indexResource = location.createRelative(pathPrefix + ".html"); if (indexResource.exists() && indexResource.isReadable()) { return indexResource; } } return new ClassPathResource("/dynamic/index.html"); } }); } } ``` 4. 在 `/dynamic` 目录下创建静态资源文件,例如 `/dynamic/index.html`。 5. 启动应用,访问 `http://localhost:8080/dynamic/index.html` 即可动态静态资源。 以上就是使用 `ResourceHttpRequestHandler` 实现动态静态资源的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普普通通程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值