场景如下:
在编写spring-mvc测试架构基类时,需要HandlerAdapter来定位处理方法。在调用invokeHandlerMethod时返回的是ModelAndView。在项目中有大量的ajax请求,这些请求并没有返回ModelAndView,因此需要进一步了解其返回机制。
前置说明:
HandlerAdapter在spring-mvc中的地位:
在HandlerMapping返回处理请求的Controller实例,需要一个帮助定位具体请求方法的处理类,这个类就是HandlerAdapter。我们可以通过实现HandlerAdapter完成任务,也可以使用spring-mvc提供的AnnotationMethodHandlerAdapter。
现根据c+s+g调查到方法调用链如下:
1-invokeHandlerMethod[AnnotationMethodHandlerAdapter]
2-getModelAndView[ServletHandlerMethodInvoker]
3-handleResponseBody[ServletHandlerMethodInvoker]
handleResponseBody源码如下:
private void handleResponseBody(Object returnValue, ServletWebRequest webRequest)
throws Exception {
if (returnValue == null) {
return;
}
HttpInputMessage inputMessage = createHttpInputMessage(webRequest);
HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest);
writeWithMessageConverters(returnValue, inputMessage, outputMessage);
}
这里我们可以猜测如果返回是@ResponseBody,那么返回的数据是直接写入到HttpServletResponse中。
目前的解决方案是:把此类测试作为普通方法测试。