我正在尝试在Spring控制器中提供静态资源。我有一个index.html文件,应该将其返回到每个请求。我的控制器是:
index.html
@Controller public class IndexController { @RequestMapping(value = "/**", method = RequestMethod.GET) public String index() { return "index.html"; } }
我也添加了资源处理程序:
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations("classpath:/"); }
但最后我有以下例外:
循环视图路径[/index.html]:将再次分派回当前处理程序URL [/index.html]。检查您的ViewResolver设置!(提示:由于默认视图名称的生成,这可能是未指定视图的结果。)
我了解,在我的配置中,所有请求都将由Spring控制器处理。
因此,当我请求http://localhost/someText该请求时,例如该请求将由我的控制器处理,然后我的控制器将重定向发送到//localhost/index.html,该请求转到Spring的请求DispatcherServlet,然后再次重定向到我的控制器,从而导致上述异常。
http://localhost/someText
//localhost/index.html
DispatcherServlet
我也已经尝试了一些选项:制作Web过滤器,该过滤器将处理我的请求,/index.html而不是通过spring servlet,而是通过默认情况下的处理(对于我DefaultServlet的undertow而言),但这是不可能的,因为我的应用程序未打包为war和index.html文件位于/src/java/resources。
/index.html
DefaultServlet
/src/java/resources
实际上,我发现主要的问题是在spring的DispatcherServlet处理程序中,我的request(//localhost/index.html)被检测为控制器,而不是资源处理程序。
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { for (HandlerMapping hm : this.handlerMappings) { if (logger.isTraceEnabled()) { logger.trace( "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'"); } HandlerExecutionChain handler = hm.getHandler(request); if (handler != null) { return handler; } } return null; }
因此,也许有一种方法可以更改HandlerMapping的顺序,以使资源映射比端点映射器具有更高的优先级?或者是否可以排除/index.html来自控制器的请求以能够使用spring资源处理程序处理它?
HandlerMapping
我已经通过以下方式弄清楚了:我定义了请求,应该在某些确切的控制器中对其进行处理。然后我创建了过滤器,该过滤器将所有其他请求添加到路径中的前缀“ / root”。我创建了一个控制器,该控制器处理为我的index.html服务的所有“ / root / **”请求。
因此,基本上,当我请求“ / api / someApi”时,它将带有API内容发送到我的控制器。但是,当我请求“ / someStuff /”时,在过滤器中它变为“ / root / someStuff /”,因此它返回到我的控制器,返回“ /index.html”。