前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC源码解析之ServletInvocableHandlerMethod

SpringMVC源码解析之ServletInvocableHandlerMethod

作者头像
JavaEdge
发布2021-02-22 14:56:01
4120
发布2021-02-22 14:56:01
举报
文章被收录于专栏:JavaEdgeJavaEdge

InvocableHandlerMethod

提供了一种方法,用于调用处理器方法,处理给定的请求,其已通过注册的HandlerMethodArgumentResolver解析了方法参数值。

参数解析往往需要WebDataBinder用于数据结合或进行类型转换。 使用setDataBinderFactory(WebDataBinderFactory)属性来提供一种粘合剂厂传递给参数解析器。 使用setHandlerMethodArgumentResolvers自定义的参数解析器的列表。

invokeForRequest

解析给定请求的上下文中其参数值后调用指定方法。 参数值是通过HandlerMethodArgumentResolver解析的。

doInvoke

调用与给定的参数值的处理方法

代码语言:javascript
复制
	protected Object doInvoke(Object... args) throws Exception {
		ReflectionUtils.makeAccessible(getBridgedMethod());
		try {
			return getBridgedMethod().invoke(getBean(), args);
		}
		catch (IllegalArgumentException ex) {
			assertTargetBean(getBridgedMethod(), getBean(), args);
			String text = (ex.getMessage() != null ? ex.getMessage() : "Illegal argument");
			throw new IllegalStateException(getInvocationErrorMessage(text, args), ex);
		}
		catch (InvocationTargetException ex) {
			// Unwrap for HandlerExceptionResolvers ...
			Throwable targetException = ex.getTargetException();
			if (targetException instanceof RuntimeException) {
				throw (RuntimeException) targetException;
			}
			else if (targetException instanceof Error) {
				throw (Error) targetException;
			}
			else if (targetException instanceof Exception) {
				throw (Exception) targetException;
			}
			else {
				String text = getInvocationErrorMessage("Failed to invoke handler method", args);
				throw new IllegalStateException(text, targetException);
			}
		}
	}

ServletInvocableHandlerMethod

扩展InvocableHandlerMethod通过注册的能力来处理返回值HandlerMethodReturnValueHandler并且还支持设置基于方法级响应状态@ResponseStatus注解。 甲null返回值(包括空隙)可以被解释为请求处理结束结合有@ResponseStatus注释,未改性的检查条件(见ServletWebRequest.checkNotModified(long) ),或提供对所述接入的方法的参数响应流

invokeAndHandle

调用该方法,并通过所配置的HandlerMethodReturnValueHandler处理返回值

  • WebRequest - 当前请求
  • mavContainer - 在ModelAndViewContainer此请求
  • providedArgs - “给”论据类型匹配(未解析)
代码语言:javascript
复制
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
		Object... providedArgs) throws Exception {

	Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
	setResponseStatus(webRequest);

	if (returnValue == null) {
		if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {
			mavContainer.setRequestHandled(true);
			return;
		}
	}
	else if (StringUtils.hasText(getResponseStatusReason())) {
		mavContainer.setRequestHandled(true);
		return;
	}

	mavContainer.setRequestHandled(false);
	try {
		this.returnValueHandlers.handleReturnValue(
				returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
	}
	catch (Exception ex) {
		if (logger.isTraceEnabled()) {
			logger.trace(getReturnValueHandlingErrorMessage("Error handling return value", returnValue), ex);
		}
		throw ex;
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • InvocableHandlerMethod
    • invokeForRequest
      • doInvoke
      • ServletInvocableHandlerMethod
        • invokeAndHandle
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档