Spring Boot不提供静态内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 BTW)

答案

一年多以后没有提高死亡人数,但所有以前的答案都错过了一些关键点:

  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;
  3. 如前所述,请求URL将相对于这些位置进行解析。因此,当请求URL为src/main/resources/static/index.html时,将提供/index.html。从Spring 4.1开始,负责解析路径的类是org.springframework.web.servlet.resource.PathResourceResolver
  4. 默认情况下启用后缀模式匹配,这意味着对于请求URL /index.html,Spring将查找与/index.html对应的处理程序。如果打算提供静态内容,这是一个问题。要禁用它,请扩展WebMvcConfigurerAdapter(但不要使用@EnableWebMvc)并覆盖configurePathMatch,如下所示: @Override public void configurePathMatch(PathMatchConfigurer configurer) { super.configurePathMatch(configurer); configurer.setUseSuffixPatternMatch(false); }

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

另一答案

只是为一个旧问题添加另一个答案......人们已经提到@EnableWebMvc将阻止加载WebMvcAutoConfiguration,这是负责创建静态资源处理程序的代码。还有其他条件会阻止WebMvcAutoConfiguration加载。最清楚的方法是查看来源:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java#L139-L141

在我的例子中,我包括一个库,该库有一个从WebMvcConfigurationSupport扩展的类,这是一个阻止自动配置的条件:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

永远不要从WebMvcConfigurationSupport延伸是很重要的。相反,从WebMvcConfigurerAdapter延伸。

另一答案

如果在IDE中启动应用程序时出现问题(即从Eclipse或IntelliJ Idea开始),并使用Maven,解决方案的关键在于Spring-boot Getting Started文档:

如果您使用的是Maven,请执行:

mvn package && java -jar target/gs-spring-boot-0.1.0.jar

其中重要的部分是添加package目标,以便在应用程序实际启动之前运行。 (想法:Run菜单,Edit Configrations...Add,并选择Run Maven Goal,并在该字段中指定package目标)

另一答案

有两件事需要考虑(Spring Boot v1.5.2.RELEASE) - 1)检查@EnableWebMvc注释的所有Controller类,如果有则删除它2)检查使用了注释的Controller类 - @RestController或@Controller 。不要在一个类中混合Rest API和MVC行为。对于MVC,使用@Controller和REST API使用@RestController

做上述两件事解决了我的问题。现在我的spring boot正在加载静态资源,没有任何问题。 @Controller => load index.html =>加载静态文件。

@Controller
public class WelcomeController {

    // inject via application.properties
    @Value("${welcome.message:Hello}")
    private String message = "Hello World";

    @RequestMapping("/")
    public String home(Map<String, Object> model) {
        model.put("message", this.message);
        return "index";
    }

}

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>index</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


    <link rel="stylesheet/less" th:href="@{/webapp/assets/theme.siberia.less}"/>

    <!-- The app's logic -->
    <script type="text/javascript" data-main="/webapp/app" th:src="@{/webapp/libs/require.js}"></script>
    <script type="text/javascript">
        require.config({
            paths: { text:"/webapp/libs/text" }
        });
    </script>



   <!-- Development only -->
     <script type="text/javascript" th:src="@{/webapp/libs/less.min.js}"></script>


</head>
<body>

</body>
</html>
另一答案

我使用1.3.5并通过Jersey实现托管一堆REST服务。这很好,直到我决定添加几个HTML + js文件。在这个论坛上给出的答案都没有帮助我。但是,当我在我的pom.xml中添加了以下依赖项时,src / main / resources / static中的所有内容终于通过浏览器显示:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<dependency>

似乎spring-web / spring-webmvc是重要的传递依赖,它使spring boot auto配置打开。

另一答案

仅供参考:我也注意到我可以弄乱一个完美的弹簧启动应用程序,并防止它从静态文件夹中提供内容,如果我添加一个坏的休息控制器,如此

 @RestController
public class BadController {
    @RequestMapping(method= RequestMethod.POST)
    public String someMethod(@RequestParam(value="date", required=false)String dateString, Model model){
        return "foo";
    }
}

在此示例中,在将坏控制器添加到项目后,当浏览器要求在静态文件夹中提供文件时,错误响应为“405 Method Not Allowed”。

注意路径未映射到坏控制器示例中。

另一答案

我在spring boot 2.1.3中遇到了同样的问题,说资源找不到404.我从applicatiion.properties中删除了以下内容。

#spring.resources.add-mappings=true
#spring.resources.static-locations=classpath:static
#spring.mvc.static-path-pattern=/**,

删除了@enableWebMVC并删除了任何WebMvcConfigurer覆盖

// @ EnableWebMvc

还要确保在配置中有@EnableAutoConfiguration。

并将所有静态资源放入src / main / resources / static中,它最终就像魔术一样......

另一答案

有同样的问题,使用gradle和eclipse并花费数小时试图解决它。

不需要编码,诀窍是必须使用菜单选项New-> Source Folder(NOT New - > Folder)在src / main / resources下创建静态文件夹。不知道为什么会这样,但是新的 - >源文件夹然后我将文件夹命名为static(然后源文件夹对话框会给出一个必须检查的错误:更新其他源文件夹中的排除过滤器以解决嵌套问题)。我的新静态文件夹我添加了index.html,现在它可以工作了。

另一答案

好吧有时值得检查你是否覆盖了一些休息控制器的全局映射。简单的例子错误(kotlin):

@RestController("/foo")
class TrainingController {

    @PostMapping
    fun bazz(@RequestBody newBody: CommandDto): CommandDto = return commandDto

}

在上述情况下,您将在请求静态资源时获得:

{
    title: "Method Not Allowed",
    status: 405,
    detail: "Request method 'GET' not supported",
    path: "/index.html"
}

原因可能是你想将@PostMapping映射到/foo但忘记@RequestMapping级别上的@RestController注释。在这种情况下,所有请求都映射到POST,在这种情况下您将不会收到静态内容。

另一答案

我处于相同的情况,我的spring-boot角度应用程序(集成)不提供静态文件夹内容以在localhost:8080上显示UI。前端是在angular4中开发的,所以使用ng build在输出路径dir src / main / resources / static中生成文件,但不显示任何内容。我专门为index.html提供了一个控制器,但似乎有些东西是关于spring-boot以了解角度路由的东西和localhost:8080只是在网页上显示我的控制器方法“index.html”返回的字符串。下面是index.html(我在body中更改了默认选择器标签,因为登录组件是我创建的那个,我的主要角度组件用于UI但是仍然无法运行app-root还是这个):

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Hello Test App</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-login></app-login>
<script type="text/javascript" src="runtime.js"></script><script type="text/javascript" src="polyfills.js"></script><script type="text/javascript" src="styles.js"></script><script type="text/javascript" src="vendor.js"></script><script type="text/javascript" src="main.js"></script></body>
</html>

控制器代码:

以上是关于Spring Boot不提供静态内容的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot with Security不提供我的静态内容

Spring Boot不提供静态内容(angular-cli)以在tomcat上提供应用程序

Spring boot:提供公共和私有(受限)静态内容

如何在 Spring Boot 2.2.6 中提供静态内容?

Spring Boot 提供被安全阻止的静态内容

如何使用 jar 外部的 spring boot 提供静态内容?