我在Spring Boot之上构建了一个项目,使用了初学者:spring-boot-starter-web
,spring-boot-starter-thymeleaf
和spring-boot-starter-security
。因此,网络和百万美元的启动者使用web和thymeleaf自动配置来设置一些基本的东西。所有配置都是通过java配置完成的。我有一堆控制器,驻留在classpath:/static/**
中的静态文件和classpath:/templates
中的模板。 Spring Boot自动配置负责提供带注释的控制器,百万美元模板和静态文件。
对于模板,我通过使用WebMvcConfigurerAdapter
覆盖addViewControllers
直接提供到视图映射的网址来提供服务,例如,映射网址/index
查看index.html
由registry.addViewController("/index").setViewName("index")
完成。
我需要的是通过回退建立资源解析的URL层次结构,例如,如果我键入URL /x/y/z
Spring应该检查:
x/y/z
x/y/z
x/y/z
x/y/z
解决方案#1。用户M. Deinum建议在UrlFilenameViewController
或RequestMappingHandlerMapping
中设置BeanNameHandlerMapping
作为默认处理程序。
CAVEAT。重定向通过将所有请求映射到UrlFilenameViewController
来工作,视图得到正确解析,但静态资源,控制器URL和其他所有内容都被视为视图和百万富翁视图解析器通过抛出500错误而因为找不到模板而抱怨,所以没有优雅的后备。
解决方案#2。使用SimpleUrlHandlerMapping
添加映射"**/*.html"
并将此请求重定向到UrlFilenameViewController
。
CAVEAT。这使得控制器,静态资源和模板得到正确解析,因为请求被*.html
映射隔离但是如果我再次键入/x/y/foo-bar-view.html
,则百万富翁视图解析器会抱怨不存在的模板,所以再次没有优雅的回退。 / p>
在检查所有指定的资源映射URL之后,理想情况下,解决方案最后应抛出404错误。