Circular View Path Error

2020/11/04 38

Spring bug

在 Spring MVC 中,如果返回的试图名称与路由一样,就会抛出一个异常:

Circular view path [path]: would dispatch back to the current handler URL [/path] 
again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, 
due to default view name generation.)

复现代码

@Controller
public class CircularViewPathController {
 
    @GetMapping("/path")
    public String path() {
        return "path";
    }
}

错误原因

当你不声明 ViewResolver 时,Spring 注册一个默认的 InternalResourceViewResolver,它创建 JstlView 的实例来呈现 view。

JstlView 派生自 InternalResourceView,它是 JSP 或者其它资源的包装器。 将模型对象公开为 request attribute,然后使用 javax.servlet.RequestDispatcher 将请求转发到指定的资源URL。

该视图的 URL 应该用于指定 Web 应用程序中的资源,适用于 RequestDispatcher 的 forward或 include 方法。

换句话说,视图在渲染之前将尝试获取要 forward() 到的 RequestDispatcher。 在执行此操作之前,它会检查以下内容:

if (path.startsWith("/") ? uri.equals(path) : uri.equals(StringUtils.applyRelativePath(uri, path))) {
    throw new ServletException("Circular view path [" + path + "]: would dispatch back " +
                        "to the current handler URL [" + uri + "] again. Check your ViewResolver setup! " +
                        "(Hint: This may be the result of an unspecified view, due to default view name generation.)");
}

其中 path 是视图名称, 在此示例中,它是 path。 变量 uri 保存正在处理的请求的 uri ,即/path

上面的代码意味着,如果要转发到 /path,相同的 servlet(因为相同的 servlet 处理前一个)将处理请求,并且您将陷入无限循环。

解决办法

重命名视图名称,确保它与 path 不同,例如 th-path.html


Stackoverflow
https://www.baeldung.com/spring-circular-view-path-error