我试图在Spring控制器中提供静态资源。
我有一个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
然后再次重定向到我的控制器,这导致上面的例外。
此外,我已经尝试了一些选项:制作网页过滤器,它将处理我的请求/index.html
而不是通过spring servlet,但是通过默认的(在我的情况下DefaultServlet
底部),但它& #39; s不可能,因为我的应用未打包为war,我的index.html
文件位于/src/java/resources
。
实际上我发现,对我来说,主要的问题是我的DispatcherServlet
处理程序中我的请求(//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资源处理程序处理它?</ p>
答案 0 :(得分:0)
我已经按照以下方式想出来了: 我定义了请求,应该在一些精确的控制器中处理。 然后我创建了Filter,它在路径中添加了所有其他请求前缀“/ root”。我制作了一个控制器,它处理所有服务于我的index.html的“/ root / **”请求。
所以,基本上,当我请求“/ api / someApi”时 - 所以它会通过API函数传递给我的控制器。但是当我请求“/ someStuff /”时 - 在过滤器中它变为“/ root / someStuff /” - 所以它会转到我的控制器返回“/index.html”。