javax.servlet.ServletException: Circular view path - 解析与解决
![Circular view path](
在Java 在Web开发中,我们经常遇到javax.servlet.ServletException: Circular view path异常。这种异常通常是由视图分析器配置错误或循环依赖引起的。本文将详细介绍异常的原因和常见的解决方案,并提供一些实际的代码示例。
异常原因分析Spring 在MVC中,视图分析器(View Resolver)负责将控制器方法返回的逻辑视图名分析为特定的视图对象。当控制器方法返回的逻辑视图名与实际视图名相同时,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"视图解析器将其视为视图文件,而非逻辑视图。因此,会出现循环引用,从而抛出Circularar view path异常。
解决办法解决Circular view path异常有以下几种方法:
1. 检查视图分析器的配置首先,我们需要检查视图分析器的配置,以确保逻辑视图名和实际视图名不重复。如果有重复,我们需要修改视图分析器的配置,以避免循环引用。
例如,我们可以将视图分析器的前缀和后缀修改为其他值,也可以将逻辑视图名改为与实际视图名不同的值。
@Beanpublic 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项目的代码示例演示了如何避免Circularr view path异常。
1. 视图分析器配置@Beanpublic InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver;}
2. 控制器方法@Controllerpublic 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>