Spring MVC 关于视图名的推断
最近在看Spring in Action学习Spring MVC,发现Spring对视图名的推断有点迷,下面举个例子
@RequestMapping("/spittles")
public class SpittleController {
...
@RequestMapping(value = "/{max}/{count}", method = RequestMethod.GET)
public List<Spittle> spittle(@PathVariable long max, @PathVariable int count) {
return spittleRepository.findSpittles(max, count);
}
...
}
比如上面这个控制器,spittle方法会处理/spittles/{max}/{count}
的GET
请求,注意这里没有返回视图名称,也没有显式地设定模型,模型的key会通过返回类型推断(包含Spittle
类型的List
所以是spittleList
,首字母小写),模型的value就是返回值。逻辑视图的名称则会由请求路径推断,假设请求为/spittles/1234/20/
,则逻辑视图名称则为spittle/1234/20
,视图名推断是通过请求路径删掉开头的斜线得到的,因此以下测试会得到通过
@Test
public void shouldShowRecentSpittles() throws Exception {
List<Spittle> expectedSpittles = createSpittleList(20);
SpittleRepository mockRepository =
mock(SpittleRepository.class); // 创建接口的mock实现
when(mockRepository.findSpittles(1234, 20))
.thenReturn(expectedSpittles);
SpittleController spittleController =
new SpittleController(mockRepository);
MockMvc mockMvc = standaloneSetup(spittleController)
.setSingleView(
new InternalResourceView("/WEB-INF/views/spittles.jsp"))
.build();
mockMvc.perform(get("/spittles/1234/20"))
.andExpect(view().name("spittles/1234/20")) // 视图名,重点!
.andExpect(model().attributeExists("spittleList"))
.andExpect(model().attribute("spittleList",
hasItems(expectedSpittles.toArray())));
}