我的一个控制器中有以下代码:
@Controller
@RequestMapping("/preference")
public class PreferenceController {
@RequestMapping(method = RequestMethod.GET, produces = "text/html")
public String preference() {
return "preference";
}
}
我只是尝试使用 Spring MVC 测试 来测试它,如下所示:
@ContextConfiguration
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class PreferenceControllerTest {
@Autowired
private WebApplicationContext ctx;
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = webAppContextSetup(ctx).build();
}
@Test
public void circularViewPathIssue() throws Exception {
mockMvc.perform(get("/preference"))
.andDo(print());
}
}
我收到以下异常:
循环视图路径 [preference]:将再次分派回当前处理程序 URL [/preference]。检查您的 ViewResolver 设置! (提示:由于默认视图名称生成,这可能是未指定视图的结果。)
我觉得奇怪的是, 当我加载包含模板和视图解析器的“完整”上下文配置时,它工作正常,如下所示:
<bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver" id="webTemplateResolver">
<property name="prefix" value="WEB-INF/web-templates/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
<property name="characterEncoding" value="UTF-8" />
<property name="order" value="2" />
<property name="cacheable" value="false" />
</bean>
我很清楚模板解析器添加的前缀确保应用程序使用此模板解析器时不会出现“循环视图路径”。
但是我应该如何使用 Spring MVC 测试来测试我的应用程序呢?
原文由 balteo 发布,翻译遵循 CC BY-SA 4.0 许可协议
这与 Spring MVC 测试无关。
When you don’t declare a
ViewResolver
, Spring registers a defaultInternalResourceViewResolver
which creates instances ofJstlView
for rendering theView
.JstlView
类扩展InternalResourceView
这是强调我的。换句话说,在渲染之前,视图将尝试获取
RequestDispatcher
到forward()
。在执行此操作之前,它会检查以下内容其中
path
是视图名称,您从@Controller
返回的内容。在此示例中,即preference
。变量uri
保存正在处理的请求的 uri,即/context/preference
。上面的代码意识到,如果您转发到
/context/preference
,同一个 servlet(因为前一个处理的是同一个 servlet)将处理该请求,您将进入无限循环。When you declare a
ThymeleafViewResolver
and aServletContextTemplateResolver
with a specificprefix
andsuffix
, it builds theView
differently ,给它一条像ThymeleafView
实例通过使用—找到相对于ServletContext
路径的文件ServletContextResourceResolver
最终
这将获取与
ServletContext
路径相关的资源。然后它可以使用TemplateEngine
生成 HTML。这里不可能发生无限循环。