弹簧控制器中的圆形视图

时间:2016-05-12 11:46:35

标签: java spring spring-mvc spring-boot

我试图在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>

1 个答案:

答案 0 :(得分:0)

我已经按照以下方式想出来了: 我定义了请求,应该在一些精确的控制器中处理。 然后我创建了Filter,它在路径中添加了所有其他请求前缀“/ root”。我制作了一个控制器,它处理所有服务于我的index.html的“/ root / **”请求。

所以,基本上,当我请求“/ api / someApi”时 - 所以它会通过API函数传递给我的控制器。但是当我请求“/ someStuff /”时 - 在过滤器中它变为“/ root / someStuff /” - 所以它会转到我的控制器返回“/index.html”。