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


问题内容

我的应用程序是使用前端的主干和后端的spring框架构建的。这是一个单独的html应用程序。路由是由骨干网处理的,因此我有一个具有以下结构的后端路由:

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

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

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

我如何将除/ js / 和/ assets / 之外的所有路由都指向我的index.html?

谢谢


问题答案:

首先,映射到的控制器方法/**将优先于任何资源请求。您可以通过增加的优先级来解决此问题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");
    }
}

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

spring.resources.addMappings=false