更改Spring Boot中的服务静态内容的默认URL映射

时间:2016-12-28 02:50:44

标签: spring-boot web-deployment

我的静态资源在我的应用程序中添加了一个新的控制器(非休息)后立即停止工作,并带有以下映射

@RequestMapping(value = "/{postId}/{postUri:.+}", method = RequestMethod.GET)
public String viewPost(@ModelAttribute("model") ModelMap model, PathVariable("postId") String postId, PathVariable("postUri") String postUri) {
          // do something
}

调试后我发现我新添加的控制器方法开始获取静态资源,基本上,它优先于静态资源的默认映射。

例如,对以下静态资源的请求到达我的控制器而不是静态资源处理程序。

http://localhost:7999/css/bootstrap-2a31dca112f26923b51676cb764c58d5.css

我正在使用spring boot 1.4

有没有办法修改映射URL以提供默认静态内容,因为我不想修改Controller方法的URL?

5 个答案:

答案 0 :(得分:4)

当然可以。您可以使用spring.mvc.static-path-pattern来覆盖:

spring.mvc.static-path-pattern=/resources/**

会将classpath:/static/css/foo.css映射到/resources/css/foo.css

(我在a862b6d

中做得更清楚了

话虽如此,我只能强烈建议改变你的路径。拥有一个捕获根上下文的路径变量是真的一个坏主意。

答案 1 :(得分:1)

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-spring-mvc-static-content

默认情况下,Spring Boot将从类路径中的/ static(或/ public或/ resources或/ META-INF / resources)目录或ServletContext的根目录中提供静态内容。它使用Spring MVC中的ResourceHttpRequestHandler,因此您可以通过添加自己的WebMvcConfigurerAdapter并覆盖addResourceHandlers方法来修改该行为。

在独立的Web应用程序中,还启用了容器中的默认servlet,并充当后备,如果Spring决定不处理它,则从ServletContext的根目录提供内容。大多数情况下,这不会发生(除非您修改默认的MVC配置),因为Spring总是能够通过DispatcherServlet处理请求。

默认情况下,资源映射到/ **,但您可以通过spring.mvc.static-path-pattern调整它。例如,可以按如下方式将所有资源重新定位到/ resources / **:

spring.mvc.static-path-pattern=/resources/**

您还可以使用spring.resources.static-locations自定义静态资源位置(将默认值替换为目录位置列表)。如果您这样做,默认的欢迎页面检测将切换到您的自定义位置,因此如果您在启动时的任何位置都有index.html,它将成为应用程序的主页。

除了上面的“标准”静态资源位置之外,还为Webjars内容制作了一个特例。如果以Webjars格式打包,那么在/ webjars / **中具有路径的任何资源都将从jar文件中提供。

答案 2 :(得分:0)

我使用@EnableWebMVC。这对我和弹簧启动服务服务器静态内容起作用是默认的 localhost:8888 /也适用于localhost:8888 / some / path /

@Configuration
public static class WebServerStaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/some/path/").setViewName("forward:/index.html");
    }
}

答案 3 :(得分:0)

我在spring.resources.static-location=file:../frontend/build

中添加了application.properties

index.html出现在build文件夹

使用也可以添加绝对路径

spring.resources.static-location=file:/User/XYZ/Desktop/frontend/build

答案 4 :(得分:0)

对于没有控制器页面:

@Controller
@RequestMapping("/feature")
public class DataTableController {

    // map /feature/* to /feature/*
    @RequestMapping(value="/{name}", method = RequestMethod.GET)
    public ModelAndView staticPage(@PathVariable String name){
        return new ModelAndView("feature/" + name);
    }

}

对于除HTML以外的静态资源:

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    // map /res/ to classpath:/resources/static/
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/res/**").addResourceLocations("classpath:/static/");
    }
}