spring控制器中的圆形视图
问题内容:
我正在尝试在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
,然后再次重定向到我的控制器,从而导致上述异常。
我也已经尝试了一些选项:制作Web过滤器,该过滤器将处理我的请求,/index.html
而不是通过spring
servlet,而是通过默认情况下的处理(对于我DefaultServlet
的undertow而言),但这是不可能的,因为我的应用程序未打包为war和index.html
文件位于/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资源处理程序处理它?
问题答案:
我已经通过以下方式弄清楚了:我定义了请求,应该在某些确切的控制器中对其进行处理。然后我创建了过滤器,该过滤器将所有其他请求添加到路径中的前缀“ /
root”。我创建了一个控制器,该控制器处理为我的index.html服务的所有“ / root / **”请求。
因此,基本上,当我请求“ / api / someApi”时,它将带有API内容发送到我的控制器。但是,当我请求“ / someStuff
/”时,在过滤器中它变为“ / root / someStuff /”,因此它返回到我的控制器,返回“ /index.html”。