Spring Boot不提供静态内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot不提供静态内容相关的知识,希望对你有一定的参考价值。
我无法让我的Spring-boot项目提供静态内容。
我在static
下放了一个名为src/main/resources
的文件夹。在里面我有一个名为images
的文件夹。当我打包应用程序并运行它时,它找不到我放在该文件夹上的图像。
我试图把静态文件放在public
,resources
和META-INF/resources
但没有任何作用。
如果我jar -tvf app.jar我可以看到文件在右边文件夹的jar里面:/static/images/head.png
例如,但是调用:http://localhost:8080/images/head.png
,我得到的只是一个404
有什么想法为什么spring-boot没有找到这个? (我使用的是1.1.4 BTW)
一年多以后没有提高死亡人数,但所有以前的答案都错过了一些关键点:
- 你班上的
@EnableWebMvc
将禁用org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
。如果您想要完全控制,那就没关系,否则,这是一个问题。 - 除了已经提供的内容之外,无需编写任何代码来为静态资源添加其他位置。从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;
- 如前所述,请求URL将相对于这些位置进行解析。因此,当请求URL为
src/main/resources/static/index.html
时,将提供/index.html
。从Spring 4.1开始,负责解析路径的类是org.springframework.web.servlet.resource.PathResourceResolver
。 - 默认情况下启用后缀模式匹配,这意味着对于请求URL
/index.html
,Spring将查找与/index.html
对应的处理程序。如果打算提供静态内容,这是一个问题。要禁用它,请扩展WebMvcConfigurerAdapter
(但不要使用@EnableWebMvc
)并覆盖configurePathMatch
,如下所示:@Override public void configurePathMatch(PathMatchConfigurer configurer) { super.configurePathMatch(configurer); configurer.setUseSuffixPatternMatch(false); }
恕我直言,在代码中减少错误的唯一方法是尽可能不编写代码。使用已经提供的内容,即使需要进行一些研究,回报也是值得的。
只是为一个旧问题添加另一个答案......人们已经提到@EnableWebMvc
将阻止加载WebMvcAutoConfiguration
,这是负责创建静态资源处理程序的代码。还有其他条件会阻止WebMvcAutoConfiguration
加载。最清楚的方法是查看来源:
在我的例子中,我包括一个库,该库有一个从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上提供应用程序