Spring Boot没有提供静态内容
现在,我正在撞墙的时候头几个小时。 我的项目几乎完成,但我无法获得静态内容。
我在src/main/resources
了一个名为static
的文件夹。 里面有一个名为images
的文件夹。 当我打包应用程序并运行它时,找不到放在该文件夹中的图像。
我试图把静态文件public
, resources
和META-INF/resources
但没有任何工作。
如果我jar -tvf app.jar我可以看到,文件是在正确的文件夹的jar:例如,但调用: http://localhost:8080http://img.dovov.comhead.png
,我得到的只是一个404
任何想法,为什么春季启动没有find这个? (我正在使用1.1.4 BTW)
一年多之后不要再提高死亡率,但是以前的答案都错过了一些关键点:
- 您的类上的
@EnableWebMvc
将禁用org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
。 这很好,如果你想完全控制,但否则,这是一个问题。 -
除了已经提供的内容之外,不需要编写任何代码来为静态资源添加另一个位置。 查看v1.3.0.RELEASE中的
org.springframework.boot.autoconfigure.web.ResourceProperties
,我看到一个可以在application.properties
configuration的字段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;
-
如前所述,请求URL将相对于这些位置被parsing。 因此,当请求URL是
/index.html
时,src/main/resources/static/index.html
将被提供。 从4.1开始,负责parsingpath的类是org.springframework.web.servlet.resource.PathResourceResolver
。 -
后缀模式匹配默认启用,这意味着对于请求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/resources
或main/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. } ...
}