
WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.http.PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId
ServletRequestMethodArgumentResolver 以上的部分参数
传入Servlet api以及内部原理
//真正执行的目标方法
lnvocableHandlerMethod.java
//核心方法
--->getMethodArgumentValues();方法
--->
//核心代码片段(判断那个解析器,能解析当前参数HttpServletRequest)
1 //Dbug调试代码
if(!this.resoulvers.supportsParameter(parameter)){
throw new IllegalStateException(formatArgumentError(parameter,"No suitable resolver"))
}
//【Dbug调试1】
//进入源码看那个解析器能够解析当前参数HttpServletRequest
@Nullable
private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
if (result == null) {
//遍历26个参数解析器,按个确定
for (HandlerMethodArgumentResolver resolver : this.argumentResolvers) {
//判断当前26个参数解析器,谁支持当前参数的解析,
2 //Dbug调试
if (resolver.supportsParameter(parameter)) {
result = resolver;
//缓存
//原理就是:将当前的参数同26个参数解析器进行循环对比,直到找到匹配的那个
//然后在缓存,这样下次直接在缓存中获取,效率会提高
this.argumentResolverCache.put(parameter, result);
break;
}
}
}
return result;
//【Dbug调试2】
@Override
public boolean supportsParameter(MethodParameter parameter) {
//获取当前参数类型,判断
Class> paramType = parameter.getParameterType();
return (WebRequest.class.isAssignableFrom(paramType) ||
//判断是否为ServletRequest,我们的参数HttpServletRequest就是ServletRequest
//所以判断成功
ServletRequest.class.isAssignableFrom(paramType) ||
MultipartRequest.class.isAssignableFrom(paramType) ||
HttpSession.class.isAssignableFrom(paramType) ||
(pushBuilder != null && pushBuilder.isAssignableFrom(paramType)) ||
Principal.class.isAssignableFrom(paramType) ||
InputStream.class.isAssignableFrom(paramType) ||
Reader.class.isAssignableFrom(paramType) ||
HttpMethod.class == paramType ||
Locale.class == paramType ||
TimeZone.class == paramType ||
ZoneId.class == paramType);
}
//--------------------------------------------------------------
//--->第二段核心代码片段 查看是如何解析的(刚刚我们获取到了能解析request参数的解析器,现在要准备开始解析了)
@Override
@Nullable
public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
HandlerMethodArgumentResolver resolver = getArgumentResolver(parameter);
if (resolver == null) {
throw new IllegalArgumentException("Unsupported parameter type [" +
parameter.getParameterType().getName() + "]. supportsParameter should be called first.");
}
//Dug调试
return resolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
}
//-----------------------------------------------------
//resolveArgument()方法源码分析
@Override
public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
Class> paramType = parameter.getParameterType();
// WebRequest / NativeWebRequest / ServletWebRequest
//判断当前类型是不是webRequest
if (WebRequest.class.isAssignableFrom(paramType)) {
if (!paramType.isInstance(webRequest)) {
throw new IllegalStateException(
"Current request is not of type [" + paramType.getName() + "]: " + webRequest);
}
return webRequest;
}
// ServletRequest / HttpServletRequest / MultipartRequest / MultipartHttpServletRequest
//判断当前类型是不是ServletRequest
if (ServletRequest.class.isAssignableFrom(paramType) || MultipartRequest.class.isAssignableFrom(paramType)) {
//进入源码查看
return resolveNativeRequest(webRequest, paramType);
}
// HttpServletRequest required for all further argument types
return resolveArgument(paramType, resolveNativeRequest(webRequest, HttpServletRequest.class));
}
//-----------------------------------------------------------------
//resolveNativeRequest源码查看
private T resolveNativeRequest(NativeWebRequest webRequest, Class requiredType) {
//获取当前request
T nativeRequest = webRequest.getNativeRequest(requiredType);
if (nativeRequest == null) {
throw new IllegalStateException(
"Current request is not of type [" + requiredType.getName() + "]: " + webRequest);
}
//把原生的request请求返回即可
return nativeRequest;
} 欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)