Spring Boot 不提供静态内容

新手上路,请多包涵

我无法让我的 Spring-boot 项目提供静态内容。

我在 --- 下放置了一个名为 static src/main/resources 文件夹。在其中我有一个名为 images 的文件夹。当我打包应用程序并运行它时,它找不到我放在该文件夹中的图像。

我尝试将静态文件放入 publicresourcesMETA-INF/resources 但没有任何效果。

如果我 jar -tvf app.jar 我可以看到文件在右侧文件夹的 jar 中:例如 /static/images/head.png 但调用: http://localhost:8080/images/head.png ,我得到的只是 404

任何想法为什么 spring-boot 没有找到这个? (我正在使用 1.1.4 顺便说一句)

原文由 Vinicius Carvalho 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 441
1 个回答

时隔一年多不复活,但之前所有的答案都漏掉了一些关键点:

  1. @EnableWebMvc 你的班级将禁用 org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 。如果您想要完全控制,那很好,否则,这是一个问题。

  2. 除了已经提供的内容之外,无需编写任何代码来为静态资源添加另一个位置。查看来自 v1.3.0.RELEASE 的 org.springframework.boot.autoconfigure.web.ResourceProperties ,我看到一个字段 staticLocations 可以在 application.properties 中配置。这是源代码的一个片段:

    /**
    * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
    * /resources/, /static/, /public/] plus context:/ (the root of the servlet context).
    */
   private String[] staticLocations = RESOURCE_LOCATIONS;

  1. 如前所述,请求 URL 将 对于这些位置进行解析。因此 src/main/resources/static/index.html 将在请求 URL 为 /index.html 时提供服务。从 Spring 4.1 开始,负责解析路径的类是 org.springframework.web.servlet.resource.PathResourceResolver

  2. 默认情况下启用后缀模式匹配,这意味着对于请求 URL /index.html ,Spring 将寻找与 /index.html 对应的处理程序。如果打算提供静态内容,这是一个问题。要禁用它,请扩展 WebMvcConfigurerAdapter (但不要使用 @EnableWebMvc )并覆盖 configurePathMatch ,如下所示:

    @Override
   public void configurePathMatch(PathMatchConfigurer configurer) {
       super.configurePathMatch(configurer);

       configurer.setUseSuffixPatternMatch(false);
   }

恕我直言,在代码中减少错误的唯一方法是尽可能不编写代码。使用已经提供的东西,即使需要一些研究,回报也是值得的。

2021 年 7 月编辑:

  1. WebMvcConfigurerAdapter 自 Spring 5 起已被弃用。实现 WebMvcConfigurer 并使用 @Configuration --- 进行注释。

原文由 Abhijit Sarkar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题