0
点赞
收藏
分享

微信扫一扫

springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)


(一)​​springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)​​

(二)​​springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)​​

HandlerMethodReturnValueHandler是用于对Controller中函数执行的返回值进行处理操作的,springMVC提供了多个HandlerMethodReturnValueHandler的实现类。

springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)_HandlerMethodReturnV

接口HandlerMethodReturnValueHandler定义的抽象方法还是比较简单的,源码如下:

(1)supportsReturnType用于判断是否支持对返回值的处理。

(2)handleReturnValue实现对返回值的处理操作。

public interface HandlerMethodReturnValueHandler {

//判断是否支持
boolean supportsReturnType(MethodParameter returnType);


//处理返回值操作
void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;

}


springMVC中对返回值的操作流程如下:执行过程是在ServletInvocableHandlerMethod的invokeAndHandle中

public void invokeAndHandle(ServletWebRequest webRequest,
ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
//处理操作的返回值
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
.......
//对返回值进行处理操作
this.returnValueHandlers.handleReturnValue(
returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
.........
}

具体实现是在HandlerMethodReturnValueHandlerComposite中,HandlerMethodReturnValueHandlerComposite中包含了所有springMVC提供的返回值处理器。

@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
//选择可以处理返回值的处理器
HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);
Assert.notNull(handler, "Unknown return value type [" + returnType.getParameterType().getName() + "]");
//处理返回值,具体实现是在HandlerMethodReturnValueHandler的实现类中
handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}

selectHandler是选取返回值处理器


//选择获取可以处理返回值的处理器
private HandlerMethodReturnValueHandler selectHandler(Object value, MethodParameter returnType) {
boolean isAsyncValue = isAsyncReturnValue(value, returnType);
for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {
continue;
}
if (handler.supportsReturnType(returnType)) {
return handler;
}
}
return null;
}


以上代码就完成了执行Controller函数之后对返回值的处理操作过程。





举报

相关推荐

0 条评论