Spring Boot没有提供静态内容

现在,我正在撞墙的时候头几个小时。 我的项目几乎完成,但我无法获得静态内容。

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

我试图把静态文件publicresourcesMETA-INF/resources但没有任何工作。

如果我jar -tvf app.jar我可以看到,文件是在正确的文件夹的jar:例如,但调用: http://localhost:8080http://img.dovov.comhead.png ,我得到的只是一个404

任何想法,为什么春季启动没有find这个? (我正在使用1.1.4 BTW)

一年多之后不要再提高死亡率,但是以前的答案都错过了一些关键点:

  1. 您的类上的@EnableWebMvc将禁用org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 。 这很好,如果你想完全控制,但否则,这是一个问题。
  2. 除了已经提供的内容之外,不需要编写任何代码来为静态资源添加另一个位置。 查看v1.3.0.RELEASE中的org.springframework.boot.autoconfigure.web.ResourceProperties ,我看到一个可以在application.propertiesconfiguration的字段staticLocations 。 以下是源代码片段:

     /** * 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将对于这些位置被parsing。 因此,当请求URL是/index.html时, src/main/resources/static/index.html将被提供。 从4.1开始,负责parsingpath的类是org.springframework.web.servlet.resource.PathResourceResolver

  4. 后缀模式匹配默认启用,这意味着对于请求URL /index.html将查找对应于/index.html处理程序。 这是一个问题,如果意图是服务静态内容。 要禁用该function,请扩展WebMvcConfigurerAdapter (但不要使用@EnableWebMvc )并覆盖configurePathMatch ,如下所示:

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

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

与弹簧引导状态不同,为了让我的spring-boot jar提供内容:我必须通过这个configuration类特别注册我的src / main / resources / static内容:

 @Configuration public class StaticResourceConfiguration extends WebMvcConfigurerAdapter { private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" }; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS); } } 

我有一个类似的问题,事实certificate,简单的解决scheme是让我的configuration类扩展WebMvcAutoConfiguration

 @Configuration @EnableWebMvc @ComponentScan public class ServerConfiguration extends WebMvcAutoConfiguration{ } 

我不需要任何其他代码来允许我的静态内容被提供,但是,我在src/main/webapp下放了一个名为public的目录,并将mavenconfiguration为指向src/main/webapp作为资源目录。 这意味着public被复制到target/classes ,因此在运行时为spring-boot / tomcatfind类path。

configuration可以如下进行:

 @Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcAutoConfigurationAdapter { // specific project configuration } 

这里重要的是你的WebMvcConfig 可能会重写addResourceHandlers方法,因此你需要明确地调用super.addResourceHandlers(registry) (确实如果你对默认的资源位置感到满意,你不需要重写任何方法)。

另一个需要注意的地方是,只有当资源处理程序没有映射到/** ,这些默认的资源位置( /static/public/resources/META-INF/resources )才会被注册。

从这一刻开始,如果您在名为image.jpg src/main/resources/static/images图像上有一个图像,则可以使用以下URL访问它: http://localhost:8080http://img.dovov.comimage.jpg (是端口8080上启动的服务器,部署到根上下文的应用程序)。

寻找映射到“/”的控制器,或者不映射path。

我遇到了这样的问题,得到了405个错误,几天来我的头脑都很难受。 问题原来是一个@RestController注释的控制器,我忘了用@RequestMapping注解来注释。 我猜这个映射path默认为“/”,并阻止静态内容资源映射。

你检查了Spring Boot参考文档吗?

默认情况下,Spring Boot将从类path中的/static (或/public/resources/META-INF/resources )文件夹中或从ServletContext的根文件夹中提供静态内容。

您也可以将您的项目与使用Spring MVC服务Web内容的指南进行比较,或者查看spring-boot-sample-web-ui项目的源代码。

我有这个确切的问题,然后意识到,我已经在我的application.properties中定义:

 spring.resources.static-locations=file:/var/www/static 

这是压倒我试过的一切。 在我的情况下,我想保持两个,所以我只是保留的财产,并补充说:

 spring.resources.static-locations=file:/var/www/static,classpath:static 

从src / main / resources / static以localhost:{port} /file.html提供的文件。

以上都没有为我工作,因为没有人提到这个小的财产,可以很容易地从网上复制服务于不同的目的;)

希望它有帮助! 想象一下,在这个问题的长篇大论中,

我认为以前的答案很好地解决了这个问题。 不过,我想补充一点,当你在你的应用程序中启用Spring Security的时候,你可能不得不特别地告诉Spring允许其他静态资源目录的请求,例如“/ static / fonts”

在我的例子中,默认情况下我已经安装了“/ static / css”,“/ static / js”,“/ static / images”,但是我的Spring Security实现阻止了/ static / fonts / **。

下面是我如何解决这个问题的一个例子。

 @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ..... @Override protected void configure(final HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/", "/fonts/**").permitAll(). //other security configuration rules } ..... } 

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

做了以上2件事情解决了我的问题。 现在我的春季启动加载静态资源没有任何问题。 @Controller =>加载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> 

这个解决scheme适用于我:

首先,在webapp / WEB-INF下放置一个资源文件夹,如下图所示

 -- src -- main -- webapp -- WEB-INF -- resources -- css -- image -- js -- ... 

其次,在spring的configuration文件

 @Configuration @EnableWebMvc public class MvcConfig extends WebMvcConfigurerAdapter{ @Bean public ViewResolver getViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".html"); return resolver; } @Override public void configureDefaultServletHandling( DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resource/**").addResourceLocations("WEB-INF/resources/"); } } 

然后,您可以访问您的资源内容,如http:// localhost:8080 / resource / image / yourimage.jpg

我正在使用1.3.5,并通过泽西岛实施主持一堆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启动自动configuration打开的重要传递依赖。

有同样的问题,使用gradle和eclipse,花了几个小时试图弄清楚。

不需要编码,诀窍是您必须使用菜单选项New-> Source Folder(NOT New – > Folder)来创buildsrc / main / resources下的静态文件夹。 不知道为什么这个工作,但做了新的 – >源文件夹,然后我命名文件夹静态(然后源文件夹对话框提供一个错误,您必须检查:更新在其他源文件夹中的排除filter来解决嵌套)。 我的新静态文件夹,我添加了index.html,现在它工作。

如果问题出现在从IDE内部启动应用程序(即从Eclipse或IntelliJ Idea开始)和使用Maven时,解决scheme的关键在于Spring引导入门文档:

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

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

其中最重要的部分就是在应用程序实际启动之前添加要运行的package目标。 (构思: Run菜单, Edit Configrations...Add ,然后selectRun Maven Goal ,并在字段中指定package目标)

如上所述,文件应该位于$ClassPath/statichttp://img.dovov.comname.png ,(/ static或/ public或/ resources或/ META-INF / resources)。 这个$ ClassPath表示main/resourcesmain/java目录。

如果您的文件不在标准目录中,则可以添加以下configuration:

 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/lib/**"); // like this } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { // ... etc. } ... 

}