javax.servlet.ServletException: Circular view path - 解析与解决
负责将控制器方法返回的逻辑视图名解析为具体的视图对象。当控制器方法返回的逻辑视图名与实际视图名相同时,就会出现Circular view path异常。
例如,我们有一个控制器方法如下:
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "Hello World");
return "home";
}
假设我们的视图解析器配置为将逻辑视图名加上前缀"/WEB-INF/views/"并加上后缀".jsp",那么视图解析器将把逻辑视图名"home"解析为"/WEB-INF/views/home.jsp"。但是如果我们的项目结构中已经存在名为"home.jsp"的文件,视图解析器会将其当作是视图文件,而不是逻辑视图。于是就会出现循环引用的情况,从而抛出Circular view path异常。
解决办法
解决Circular view path异常的方法有以下几种:
1. 检查视图解析器的配置
首先,我们需要检查视图解析器的配置,确保逻辑视图名和实际视图名没有重复。如果有重复的情况,我们需要修改视图解析器的配置,以避免循环引用。
例如,我们可以将视图解析器的前缀和后缀修改为其他的值,或者将逻辑视图名改为与实际视图名不同的值。
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
2. 检查控制器方法的返回值
另外,我们还需要检查控制器方法的返回值。确保返回的是逻辑视图名,而不是实际视图名。
例如,我们可以使用redirect:
前缀将返回值改为重定向的URL。
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "Hello World");
return "redirect:/home";
}
3. 检查URL路径映射
最后,我们还需要检查URL路径映射的配置。确保URL路径映射与返回的逻辑视图名没有冲突。
例如,如果我们的URL路径映射为/home
,而控制器方法返回的逻辑视图名也为/home
,那么就会出现循环引用的情况。
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "Hello World");
return "/home";
}
代码示例
下面是一个完整的Spring MVC项目的代码示例,演示了如何避免Circular view path异常。
1. 视图解析器配置
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
2. 控制器方法
@Controller
public class HomeController {
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "Hello World");
return "home";
}
}
3. 视图文件
在/WEB-INF/views/
目录下创建名为"home.jsp"的文件。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Home</title>
</head>
<body>
${message}
</body>
</html>