SpringBoot如何修复Circular view path异常?
问题现象
运行项目访问/Students路径时,日志抛出如下错误:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Circular view path [Students]: would dispatch back to the current handler URL [/Students] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)] with root cause
涉及的原有代码:
- 控制器类代码
//Controller class import java.util.List; @Controller public class StudnetController { @Autowired private StudentService studentService; @GetMapping(path = "/Students") public List<Student> getAllStudent(){ return studentService.getStudent(); } }
- 服务类代码
//service class @Service public class StudentService { @Autowired private StudentRepo studentRepo; public List<Student> getStudent(){ return studentRepo.findAll(); } }
问题原因
这个错误是SpringMVC视图解析逻辑和接口返回预期不匹配导致的:
- 控制器类使用的
@Controller注解,默认会将接口方法的返回值识别为视图名称,走视图解析跳转流程,不会直接把返回的Java对象序列化成数据格式响应给客户端。 - 当前接口方法直接返回
List<Student>类型结果,没有添加任何标记告知Spring需要将结果直接写入响应体,Spring会按照默认规则生成视图名,最终生成的视图名刚好和请求路径/Students重名,DispatcherServlet匹配到该视图后会再次转发回当前请求路径,形成循环转发,最终抛出循环视图路径异常。 - 服务层的查询逻辑没有问题,故障完全出在控制器层的注解配置上。
解决方法
两种方案选择任意一种即可修复问题:
- 方案一:将控制器类的
@Controller注解替换为@RestController。@RestController是Spring提供的组合注解,自带@ResponseBody生效逻辑,会自动将接口返回的对象序列化为JSON/XML格式写入响应体,完全跳过视图解析流程,适配当前写数据接口的需求。
修改后的控制器类代码示例://Controller class import java.util.List; @RestController public class StudnetController { @Autowired private StudentService studentService; @GetMapping(path = "/Students") public List<Student> getAllStudent(){ return studentService.getStudent(); } } - 方案二:如果需要保留
@Controller注解(比如同一个控制器内既要写返回页面的视图接口,也要写返回数据的接口),可以单独给getAllStudent方法加上@ResponseBody注解,标记该方法的返回值直接写入响应体,不做视图解析。
修改后的对应方法示例:@GetMapping(path = "/Students") @ResponseBody public List<Student> getAllStudent(){ return studentService.getStudent(); }
内容的提问来源于stack exchange,提问作者Seneth_lakshan
相关产品推荐
相关产品推荐

