You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.0.1.RELEASE中getServletContext().getResourceAsStream()返回null问题

解决Spring Boot迁移后GWT Servlet中getResourceAsStream()返回null的问题

我帮你梳理下这个问题的解决思路哈,结合Spring Boot 2.0.1的资源处理逻辑,这个getServletContext().getResourceAsStream()返回null的问题,核心原因是Spring Boot内嵌容器的资源加载机制和传统WAR部署有差异,咱们一步步来排查解决:

1. 确认资源存放位置是否正确

传统WAR项目里,资源通常放在WEB-INF或者Web根目录下,但Spring Boot默认会把src/main/resources/static、src/main/resources/public这些目录下的资源当成静态资源处理。你得确保GWT依赖的那些资源(比如afile.rpc这类)放在这些默认的资源目录里,比如src/main/resources/static/mymodule/下,这样内嵌容器才能正确识别到它们。

2. 配置资源映射,让ServletContext能定位资源

如果资源位置没法调整,或者默认映射不生效,可以在Spring Boot里自定义资源映射规则。创建一个配置类,实现WebMvcConfigurer接口,重写addResourceHandlers方法:

@Configuration
public class GwtResourceConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 把/mymodule/**路径的请求,映射到classpath下的static/mymodule目录
        registry.addResourceHandler("/mymodule/**")
                .addResourceLocations("classpath:/static/mymodule/");
    }
}

这样当你的Servlet调用getServletContext().getResourceAsStream("/mymodule/xxx")时,就能正确定位到对应目录下的资源了。

3. 检查getResourceAsStream的路径参数格式

调用方法时要注意路径的正确格式:

  • 路径必须以斜杠开头,比如"/mymodule/afile.rpc",不能写成"mymodule/afile.rpc"
  • 路径要和实际资源存放路径、配置的资源映射完全匹配,比如资源在static/mymodule/dispatch/xxx,那路径就得写成"/mymodule/dispatch/xxx"

4. 调试验证可用资源路径

可以在Servlet里加一行调试代码,打印当前能获取到的资源路径,快速判断目标资源是否存在:

Set<String> resourcePaths = getServletContext().getResourcePaths("/mymodule/");
System.out.println("Available resources: " + resourcePaths);

通过这个输出,你就能快速排查是资源没放对位置,还是路径写错了。

5. 注意打包方式的影响

如果是打包成Jar包运行,资源会被放在BOOT-INF/classes目录下,Spring Boot的内嵌容器能正常访问classpath下的资源;如果是打包成War包部署到外部容器,要确保WEB-INF/classes目录下有对应的资源文件,避免打包时资源被遗漏。


内容的提问来源于stack exchange,提问作者Gardella Juan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:24:06