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源码查看 privateT 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条)