如何在Spring MVC Test中避免”Circular view path” 异常
1. 问题的现象
比如在webConfig中定义了一个viewResolver
public class WebConfig extends WebMvcConfigurerAdapter {//配置JSP视图解析器 @Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("WEB-INF/views/");resolver.setSuffix(".jsp");resolver.setExposeContextBeansAsAttributes(true);return resolver;}}
然后定义了一个controller,URL路径为"/home", 它返回名字叫home的view
@Controller public class HomeController {@RequestMapping(value = "/home", method=GET)public ModelAndView home() {String message = "Hello";return new ModelAndView("home", "home", message);} }
然后定义了个Test
public class HomeControllerTest {@Testpublic void testHomePage() throws Exception {HomeController controller = new HomeController();MockMvc mockMvc = standaloneSetup(controller).build();mockMvc.perform(get("/home")).andExpect(view().name("home"));}}
那么执行Test是就会报类似错误并抛出异常:
Circular view path [home]: would dispatch back to the current handler URL [/home] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
2. 首先,首先说下原因:
-------------------------------
当没有声明ViewResolver时,spring会给你注册一个默认的ViewResolver,就是JstlView的实例, 该对象继承自InternalResoureView。
JstlView用来封装JSP或者同一Web应用中的其他资源,它将model对象作为request请求的属性值暴露出来, 并将该请求通过javax.servlet.RequestDispatcher转发到指定的URL.
Spring认为, 这个view的URL是可以用来指定同一web应用中特定资源的,是可以被RequestDispatcher转发的。
也就是说,在页面渲染(render)之前,Spring会试图使用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.)"); }
从这段代码可以看出,如果你的view name和你的path是相同的字符串,根据Spring的转发规则,就等于让自己转发给自己,会陷入死循环。所以Spring会检查到这种情况,于是抛出Circular view path异常。
3. 其次,如何解决?
通过原因分析,造成问题有两个因素:1). 缺省转发, 2). view和path同名
那么消除这两个因素任何一个就可以解决这个问题。
3.1 解决办法一: 消除缺省转发
虽然在controller中已经定义了view, 但在使用Spring Test时却仍然无效,这个不知道什么原因,也许是Spring Test的Bug, 有待探究。既然无效,那就在Test中重新定义一下view
, 这样虽然麻烦点,但毕竟消除了缺省转发,所以可以解决问题。示例代码如下:
public class TestJavaConfig {private MockMvc mockMvc;@InjectMocksprivate StudentController studentController;@Mockprivate StudentService studentService;@Beforepublic void setUp(){MockitoAnnotations.initMocks(this);InternalResourceViewResolver resolver = new InternalResourceViewResolver(); //在test中重新配置视图解析器resolver.setPrefix("/WEB_INF/views");resolver.setSuffix(".jsp");mockMvc = MockMvcBuilders.standaloneSetup(studentController).setViewResolvers(resolver).build();}@Testpublic void testList()throws Exception{mockMvc.perform(get("/home")).andExpect(view().name("home"));}
3.2 解决办法二: 修改view和path,让他们不同名
这个方法最简单,建议用这种办法,比如上面的home视图, 只要我们的path不是"/home"就可以,可以改view名字(比如改成homepage),或者修改/path(比如/root).
转载于:https://www.cnblogs.com/chry/p/6240965.html
如何在Spring MVC Test中避免”Circular view path” 异常相关推荐
- java注解返回不同消息,Spring MVC Controller中的一个读入和返回都是JSON的方法如何获取javax.validation注解的异常信息...
Spring MVC Controller中的一个读入和返回都是JSON的方法怎么获取javax.validation注解的错误信息? 本帖最后由 LonelyCoder2012 于 2014-03- ...
- Spring MVC环境中的文件上传功能实现
在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上 ...
- spring mvc项目中利用freemarker生成自定义标签
2019独角兽企业重金招聘Python工程师标准>>> spring mvc项目中利用freemarker生成自定义标签 博客分类: java spring mvc +freemar ...
- 头信息_如何在 Spring REST Controller 中获取 HTTP 头信息
介绍 在本篇文章中,我们将研究如何在 Spring Rest Controller 中访问 HTTP 头信息. 首先,我们将使用 @RequestHeader 注解分别或同时读取 HTTP 头信息. ...
- Spring MVC框架中关于限制请求方式
在Spring MVC框架中,@RequestMapping注解的主要作用是配置请求路径,除此以外,还可以配置请求方式,例如: @RequestMapping(value = "/add-n ...
- Spring MVC 应用中异常处理流程分析 : sendError() vs setStatus()
sendError() Spring MVC应用处理某个请求时遇到异常的话,除非开发人员明确地指定使用setStatus(),否则都是面向sendError()的处理流程,总的来说该处理流程概括如下 ...
- spring cloud 报[Circular view path [refundbbb]: would dispatch back to the current handler URL [/refu
今天在调试spring cloud的过程中,在启动了一个eureka server ,一个eureka调用者,一个eureka提供者之后.请求在提供者的方法中处理后一直返回不到调用者,报错: [Cir ...
- Springboot关于 Circular view path [xxx]: would dispatch back to the current handler URL [xxx] again
Springboot关于 Circular view path [xxx]: would dispatch back to the current handler URL [xxx] again报错问 ...
- javax.servlet.ServletException: Circular view path []: would dispatch back to the current....
解决:javax.servlet.ServletException: Circular view path []: would dispatch back to the current- 原因: 当没 ...
最新文章
- effective java读书笔记5:避免创建不必要的对象
- 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件
- 合并单元格两行_Excel合并单元格的麻烦事你都经历了哪些?来一起远离那些麻烦事...
- 游戏音乐是游戏内涵的补充
- Visual Entity 手册(十一)代码生成设置
- java在实际应用_Java应用程序如何部署在“现实世界”中?
- Hadoop系列-HDFS HA高可用集群
- JAVA程序打包成exe文件详细图解
- wps linux 在线安装程序,WPS Office 2019 For Linux下载及安装教程
- phpstudy所需的vc11和vc14运行库
- FAT32文件系统结构
- 太极图计算机,如何使用CAD快速画一个太极图?
- html怎么设置后退链接,怎么创建HTML后退按钮?
- 基于云的产品上线部署qqfarm
- 算法图解第七章狄克斯特拉算法读书笔记
- 强烈推荐33个 GitHub 前端学习资源
- 清理Maven仓库冗余文件(lastUpdated、m2e-lastUpdated.properties、空文件夹)脚本
- leetcode 区间问题
- CSS几种定位的使用
- Teams会议/实时事件中的参会者报告详解