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” 异常相关推荐

  1. java注解返回不同消息,Spring MVC Controller中的一个读入和返回都是JSON的方法如何获取javax.validation注解的异常信息...

    Spring MVC Controller中的一个读入和返回都是JSON的方法怎么获取javax.validation注解的错误信息? 本帖最后由 LonelyCoder2012 于 2014-03- ...

  2. Spring MVC环境中的文件上传功能实现

    在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上 ...

  3. spring mvc项目中利用freemarker生成自定义标签

    2019独角兽企业重金招聘Python工程师标准>>> spring mvc项目中利用freemarker生成自定义标签 博客分类: java spring mvc +freemar ...

  4. 头信息_如何在 Spring REST Controller 中获取 HTTP 头信息

    介绍 在本篇文章中,我们将研究如何在 Spring Rest Controller 中访问 HTTP 头信息. 首先,我们将使用 @RequestHeader 注解分别或同时读取 HTTP 头信息. ...

  5. Spring MVC框架中关于限制请求方式

    在Spring MVC框架中,@RequestMapping注解的主要作用是配置请求路径,除此以外,还可以配置请求方式,例如: @RequestMapping(value = "/add-n ...

  6. Spring MVC 应用中异常处理流程分析 : sendError() vs setStatus()

    sendError() Spring MVC应用处理某个请求时遇到异常的话,除非开发人员明确地指定使用setStatus(),否则都是面向sendError()的处理流程,总的来说该处理流程概括如下 ...

  7. spring cloud 报[Circular view path [refundbbb]: would dispatch back to the current handler URL [/refu

    今天在调试spring cloud的过程中,在启动了一个eureka server ,一个eureka调用者,一个eureka提供者之后.请求在提供者的方法中处理后一直返回不到调用者,报错: [Cir ...

  8. 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报错问 ...

  9. javax.servlet.ServletException: Circular view path []: would dispatch back to the current....

    解决:javax.servlet.ServletException: Circular view path []: would dispatch back to the current- 原因: 当没 ...

最新文章

  1. effective java读书笔记5:避免创建不必要的对象
  2. 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件
  3. 合并单元格两行_Excel合并单元格的麻烦事你都经历了哪些?来一起远离那些麻烦事...
  4. 游戏音乐是游戏内涵的补充
  5. Visual Entity 手册(十一)代码生成设置
  6. java在实际应用_Java应用程序如何部署在“现实世界”中?
  7. Hadoop系列-HDFS HA高可用集群
  8. JAVA程序打包成exe文件详细图解
  9. wps linux 在线安装程序,WPS Office 2019 For Linux下载及安装教程
  10. phpstudy所需的vc11和vc14运行库
  11. FAT32文件系统结构
  12. 太极图计算机,如何使用CAD快速画一个太极图?
  13. html怎么设置后退链接,怎么创建HTML后退按钮?
  14. 基于云的产品上线部署qqfarm
  15. 算法图解第七章狄克斯特拉算法读书笔记
  16. 强烈推荐33个 GitHub 前端学习资源
  17. 清理Maven仓库冗余文件(lastUpdated、m2e-lastUpdated.properties、空文件夹)脚本
  18. leetcode 区间问题
  19. CSS几种定位的使用
  20. Teams会议/实时事件中的参会者报告详解

热门文章

  1. Exp1 PC平台逆向破解 20164309 欧阳彧骁
  2. ROS自定义地图(CAD、手绘等)
  3. 【ARM】Tiny4412裸板编程之MMU(页 4K)
  4. 2011年全国软件大赛模拟题及参考答案(Java本科组)
  5. 1032 挖掘机技术哪家强 (20 分)(c语言)
  6. keepalived(4)——演练故障出现时keepalived的状态
  7. 16位汇编 在代码段中使用数据
  8. 获取CPU序列号和MAC地址
  9. 修改mysql数据库名方法_安全快速修改Mysql数据库名的5种方法
  10. 【Linux】Linux中vim的使用