Spring具有通配符控制器路由时提供静态内容

Sor*_*adu 9 spring spring-mvc spring-boot

我的应用程序是使用前端的骨干和后端的spring框架构建的.它是一个单一的HTML应用程序.路由由骨干处理,因此我有一个后端路由,具有下一个结构:

@RequestMapping(value="/**", method=RequestMethod.GET)
public String Pages()
{
    return "index";
}
Run Code Online (Sandbox Code Playgroud)

将所有内容指向我的index.html.问题是静态内容文件也指向这个路由,我不希望这样.我试图通过覆盖静态内容的addResourceHandler方法来配置WebMvcConfigurerAdapter,但它不起作用.

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/js/**").addResourceLocations("/resources/js");
    }
}
Run Code Online (Sandbox Code Playgroud)

除了/ js/**和/ assets/**之外,我如何指向我的index.html的每条路线?

谢谢

And*_*son 9

首先,映射到的控制器方法/**将优先于任何资源请求.你可以通过增加优先级来解决这个问题ResourceHandlerRegistry.registry.setOrder(Ordered.HIGHEST_PRECEDENCE)addResourceHandlers方法中添加一个调用StaticResourceConfiguration:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        registry.addResourceHandler("/js/**").addResourceLocations("/resources/js");
    }
}
Run Code Online (Sandbox Code Playgroud)

第二件事是,默认情况下,Spring Boot默认为您配置两个资源处理程序,一个映射到/**,一个映射到/webjars/**.由于上述更改,现在将优先于控制器中也映射到的方法/**.要解决此问题,您应该通过以下设置关闭默认资源处理application.properties:

spring.resources.addMappings=false
Run Code Online (Sandbox Code Playgroud)

  • 我已经尝试过您的解决方案,但每次请求都会出现 404 错误...是的,我确定已加载 application.properties。 (2认同)