在我的 Spring Boot 应用程序(版本 1 和 2)中,我的静态资源位于一个位置:
src/main/resources/static
static是Spring Boot识别的加载静态资源的文件夹。
那么思路就是自定义Spring MVC配置。
更简单的方法是使用 Spring Java 配置。
我实现WebMvcConfigurer 来覆盖addResourceHandlers()。
我在当前的ResourceHandlerRegistry 中添加了一个单个 ResourceHandler。
处理程序映射在每个请求上,我将 classpath:/static/ 指定为资源位置值(如果需要,您当然可以添加其他值)。
我添加了一个自定义 PathResourceResolver 匿名类来覆盖 getResource(String resourcePath, Resource location)。
返回资源的规则如下:如果资源存在并且是可读的(所以它是一个文件),我返回它。否则,默认情况下我会返回 index.html 页面。这是处理 HTML 5 url 的预期行为。
Spring Boot 1.X 应用程序:
扩展org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter是办法。
类是WebMvcConfigurer接口的适配器
使用空方法允许子类仅覆盖他们感兴趣的方法。
这里是完整的代码:
import java.io.IOException;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.resource.PathResourceResolver;
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath,
Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
}
}
Spring Boot 2.X 应用程序:
org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter 已弃用。
直接实现 WebMvcConfigurer 是现在的方式,因为它仍然是一个接口,但它现在具有默认方法(通过 Java 8 基线实现)并且可以直接实现而无需适配器。
这里是完整的代码:
import java.io.IOException;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath,
Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
}
}
编辑以解决一些 cmets:
对于那些将其静态资源存储在另一个位置作为src/main/resources/static 的人,因此更改addResourcesLocations() 的var args 参数的值。
例如,如果您在 static 和 public 文件夹中都有静态资源(未尝试):
registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/", "/public")