一尘不染

Spring Boot不提供静态内容

spring

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

我已经放在一个命名的文件夹staticsrc/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 BTW)


阅读 513

收藏
2020-04-11

共1个答案

一尘不染

超过一年后不复活,但先前的所有答案都遗漏了一些关键点:

  1. @EnableWebMvc在你的班级上将被禁用org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration。如果你想要完全控制,那很好,但是否则,这是一个问题。
  2. 除了已经提供的内容外,无需编写任何代码即可为静态资源添加其他位置。看着org.springframework.boot.autoconfigure.web.ResourcePropertiesv1.3.0.RELEASE,我看到一个字段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当请求网址为时将投放/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);
}

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

2020-04-11