public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean {     private static final boolean shouldIgnoreXml = SpringProperties.getFlag("spring.xml.ignore");     public static final MethodFilter INIT_BINDER_METHODS = (method) -> {         return AnnotatedElementUtils.hasAnnotation(method, InitBinder.class);     };     public static final MethodFilter MODEL_ATTRIBUTE_METHODS = (method) -> {         return !AnnotatedElementUtils.hasAnnotation(method, RequestMapping.class) && AnnotatedElementUtils.hasAnnotation(method, ModelAttribute.class);     };     @Nullable     private List<HandlerMethodArgumentResolver> customArgumentResolvers;     @Nullable     private HandlerMethodArgumentResolverComposite argumentResolvers;     @Nullable     private HandlerMethodArgumentResolverComposite initBinderArgumentResolvers;     @Nullable     private List<HandlerMethodReturnValueHandler> customReturnValueHandlers;     @Nullable     private HandlerMethodReturnValueHandlerComposite returnValueHandlers;     @Nullable     private List<ModelAndViewResolver> modelAndViewResolvers;     private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager();     private List<HttpMessageConverter<?>> messageConverters = new ArrayList(4);     private final List<Object> requestResponseBodyAdvice = new ArrayList();     @Nullable     private WebBindingInitializer webBindingInitializer;     private AsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor("MvcAsync");     @Nullable     private Long asyncRequestTimeout;     private CallableProcessingInterceptor[] callableInterceptors = new CallableProcessingInterceptor[0];     private DeferredResultProcessingInterceptor[] deferredResultInterceptors = new DeferredResultProcessingInterceptor[0];     private ReactiveAdapterRegistry reactiveAdapterRegistry = ReactiveAdapterRegistry.getSharedInstance();     private boolean ignoreDefaultModelOnRedirect = false;     private int cacheSecondsForSessionAttributeHandlers = 0;     private boolean synchronizeOnSession = false;     private SessionAttributeStore sessionAttributeStore = new DefaultSessionAttributeStore();     private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();     @Nullable     private ConfigurableBeanFactory beanFactory;     private final Map<Class<?>, SessionAttributesHandler> sessionAttributesHandlerCache = new ConcurrentHashMap(64);     private final Map<Class<?>, Set<Method>> initBinderCache = new ConcurrentHashMap(64);     private final Map<ControllerAdviceBean, Set<Method>> initBinderAdviceCache = new LinkedHashMap();     private final Map<Class<?>, Set<Method>> modelAttributeCache = new ConcurrentHashMap(64);     private final Map<ControllerAdviceBean, Set<Method>> modelAttributeAdviceCache = new LinkedHashMap();
      public RequestMappingHandlerAdapter() {         this.messageConverters.add(new ByteArrayHttpMessageConverter());         this.messageConverters.add(new StringHttpMessageConverter());         if (!shouldIgnoreXml) {             try {                 this.messageConverters.add(new SourceHttpMessageConverter());             } catch (Error var2) {             }         }
          this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());     }
      public void setCustomArgumentResolvers(@Nullable List<HandlerMethodArgumentResolver> argumentResolvers) {         this.customArgumentResolvers = argumentResolvers;     }
      @Nullable     public List<HandlerMethodArgumentResolver> getCustomArgumentResolvers() {         return this.customArgumentResolvers;     }
      public void setArgumentResolvers(@Nullable List<HandlerMethodArgumentResolver> argumentResolvers) {         if (argumentResolvers == null) {             this.argumentResolvers = null;         } else {             this.argumentResolvers = new HandlerMethodArgumentResolverComposite();             this.argumentResolvers.addResolvers(argumentResolvers);         }
      }
      @Nullable     public List<HandlerMethodArgumentResolver> getArgumentResolvers() {         return this.argumentResolvers != null ? this.argumentResolvers.getResolvers() : null;     }
      public void setInitBinderArgumentResolvers(@Nullable List<HandlerMethodArgumentResolver> argumentResolvers) {         if (argumentResolvers == null) {             this.initBinderArgumentResolvers = null;         } else {             this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite();             this.initBinderArgumentResolvers.addResolvers(argumentResolvers);         }
      }
      @Nullable     public List<HandlerMethodArgumentResolver> getInitBinderArgumentResolvers() {         return this.initBinderArgumentResolvers != null ? this.initBinderArgumentResolvers.getResolvers() : null;     }
      public void setCustomReturnValueHandlers(@Nullable List<HandlerMethodReturnValueHandler> returnValueHandlers) {         this.customReturnValueHandlers = returnValueHandlers;     }
      @Nullable     public List<HandlerMethodReturnValueHandler> getCustomReturnValueHandlers() {         return this.customReturnValueHandlers;     }
      public void setReturnValueHandlers(@Nullable List<HandlerMethodReturnValueHandler> returnValueHandlers) {         if (returnValueHandlers == null) {             this.returnValueHandlers = null;         } else {             this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite();             this.returnValueHandlers.addHandlers(returnValueHandlers);         }
      }
      @Nullable     public List<HandlerMethodReturnValueHandler> getReturnValueHandlers() {         return this.returnValueHandlers != null ? this.returnValueHandlers.getHandlers() : null;     }
      public void setModelAndViewResolvers(@Nullable List<ModelAndViewResolver> modelAndViewResolvers) {         this.modelAndViewResolvers = modelAndViewResolvers;     }
      @Nullable     public List<ModelAndViewResolver> getModelAndViewResolvers() {         return this.modelAndViewResolvers;     }
      public void setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager) {         this.contentNegotiationManager = contentNegotiationManager;     }
      public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {         this.messageConverters = messageConverters;     }
      public List<HttpMessageConverter<?>> getMessageConverters() {         return this.messageConverters;     }
      public void setRequestBodyAdvice(@Nullable List<RequestBodyAdvice> requestBodyAdvice) {         if (requestBodyAdvice != null) {             this.requestResponseBodyAdvice.addAll(requestBodyAdvice);         }
      }
      public void setResponseBodyAdvice(@Nullable List<ResponseBodyAdvice<?>> responseBodyAdvice) {         if (responseBodyAdvice != null) {             this.requestResponseBodyAdvice.addAll(responseBodyAdvice);         }
      }
      public void setWebBindingInitializer(@Nullable WebBindingInitializer webBindingInitializer) {         this.webBindingInitializer = webBindingInitializer;     }
      @Nullable     public WebBindingInitializer getWebBindingInitializer() {         return this.webBindingInitializer;     }
      public void setTaskExecutor(AsyncTaskExecutor taskExecutor) {         this.taskExecutor = taskExecutor;     }
      public void setAsyncRequestTimeout(long timeout) {         this.asyncRequestTimeout = timeout;     }
      public void setCallableInterceptors(List<CallableProcessingInterceptor> interceptors) {         this.callableInterceptors = (CallableProcessingInterceptor[])interceptors.toArray(new CallableProcessingInterceptor[0]);     }
      public void setDeferredResultInterceptors(List<DeferredResultProcessingInterceptor> interceptors) {         this.deferredResultInterceptors = (DeferredResultProcessingInterceptor[])interceptors.toArray(new DeferredResultProcessingInterceptor[0]);     }
      public void setReactiveAdapterRegistry(ReactiveAdapterRegistry reactiveAdapterRegistry) {         this.reactiveAdapterRegistry = reactiveAdapterRegistry;     }
      public ReactiveAdapterRegistry getReactiveAdapterRegistry() {         return this.reactiveAdapterRegistry;     }
      public void setIgnoreDefaultModelOnRedirect(boolean ignoreDefaultModelOnRedirect) {         this.ignoreDefaultModelOnRedirect = ignoreDefaultModelOnRedirect;     }
      public void setSessionAttributeStore(SessionAttributeStore sessionAttributeStore) {         this.sessionAttributeStore = sessionAttributeStore;     }
      public void setCacheSecondsForSessionAttributeHandlers(int cacheSecondsForSessionAttributeHandlers) {         this.cacheSecondsForSessionAttributeHandlers = cacheSecondsForSessionAttributeHandlers;     }
      public void setSynchronizeOnSession(boolean synchronizeOnSession) {         this.synchronizeOnSession = synchronizeOnSession;     }
      public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {         this.parameterNameDiscoverer = parameterNameDiscoverer;     }
      public void setBeanFactory(BeanFactory beanFactory) {         if (beanFactory instanceof ConfigurableBeanFactory) {             this.beanFactory = (ConfigurableBeanFactory)beanFactory;         }
      }
      @Nullable     protected ConfigurableBeanFactory getBeanFactory() {         return this.beanFactory;     }
      public void afterPropertiesSet() {         this.initControllerAdviceCache();         List handlers;         if (this.argumentResolvers == null) {             handlers = this.getDefaultArgumentResolvers();             this.argumentResolvers = (new HandlerMethodArgumentResolverComposite()).addResolvers(handlers);         }
          if (this.initBinderArgumentResolvers == null) {             handlers = this.getDefaultInitBinderArgumentResolvers();             this.initBinderArgumentResolvers = (new HandlerMethodArgumentResolverComposite()).addResolvers(handlers);         }
          if (this.returnValueHandlers == null) {             handlers = this.getDefaultReturnValueHandlers();             this.returnValueHandlers = (new HandlerMethodReturnValueHandlerComposite()).addHandlers(handlers);         }
      }
      private void initControllerAdviceCache() {         if (this.getApplicationContext() != null) {             List<ControllerAdviceBean> adviceBeans = ControllerAdviceBean.findAnnotatedBeans(this.getApplicationContext());             List<Object> requestResponseBodyAdviceBeans = new ArrayList();             Iterator var3 = adviceBeans.iterator();
              while(var3.hasNext()) {                 ControllerAdviceBean adviceBean = (ControllerAdviceBean)var3.next();                 Class<?> beanType = adviceBean.getBeanType();                 if (beanType == null) {                     throw new IllegalStateException("Unresolvable type for ControllerAdviceBean: " + adviceBean);                 }
                  Set<Method> attrMethods = MethodIntrospector.selectMethods(beanType, MODEL_ATTRIBUTE_METHODS);                 if (!attrMethods.isEmpty()) {                     this.modelAttributeAdviceCache.put(adviceBean, attrMethods);                 }
                  Set<Method> binderMethods = MethodIntrospector.selectMethods(beanType, INIT_BINDER_METHODS);                 if (!binderMethods.isEmpty()) {                     this.initBinderAdviceCache.put(adviceBean, binderMethods);                 }
                  if (RequestBodyAdvice.class.isAssignableFrom(beanType) || ResponseBodyAdvice.class.isAssignableFrom(beanType)) {                     requestResponseBodyAdviceBeans.add(adviceBean);                 }             }
              if (!requestResponseBodyAdviceBeans.isEmpty()) {                 this.requestResponseBodyAdvice.addAll(0, requestResponseBodyAdviceBeans);             }
              if (this.logger.isDebugEnabled()) {                 int modelSize = this.modelAttributeAdviceCache.size();                 int binderSize = this.initBinderAdviceCache.size();                 int reqCount = this.getBodyAdviceCount(RequestBodyAdvice.class);                 int resCount = this.getBodyAdviceCount(ResponseBodyAdvice.class);                 if (modelSize == 0 && binderSize == 0 && reqCount == 0 && resCount == 0) {                     this.logger.debug("ControllerAdvice beans: none");                 } else {                     this.logger.debug("ControllerAdvice beans: " + modelSize + " @ModelAttribute, " + binderSize + " @InitBinder, " + reqCount + " RequestBodyAdvice, " + resCount + " ResponseBodyAdvice");                 }             }
          }     }
      private int getBodyAdviceCount(Class<?> adviceType) {         List<Object> advice = this.requestResponseBodyAdvice;         return RequestBodyAdvice.class.isAssignableFrom(adviceType) ? RequestResponseBodyAdviceChain.getAdviceByType(advice, RequestBodyAdvice.class).size() : RequestResponseBodyAdviceChain.getAdviceByType(advice, ResponseBodyAdvice.class).size();     }
      private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {         List<HandlerMethodArgumentResolver> resolvers = new ArrayList(30);         resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), false));         resolvers.add(new RequestParamMapMethodArgumentResolver());         resolvers.add(new PathVariableMethodArgumentResolver());         resolvers.add(new PathVariableMapMethodArgumentResolver());         resolvers.add(new MatrixVariableMethodArgumentResolver());         resolvers.add(new MatrixVariableMapMethodArgumentResolver());         resolvers.add(new ServletModelAttributeMethodProcessor(false));         resolvers.add(new RequestResponseBodyMethodProcessor(this.getMessageConverters(), this.requestResponseBodyAdvice));         resolvers.add(new RequestPartMethodArgumentResolver(this.getMessageConverters(), this.requestResponseBodyAdvice));         resolvers.add(new RequestHeaderMethodArgumentResolver(this.getBeanFactory()));         resolvers.add(new RequestHeaderMapMethodArgumentResolver());         resolvers.add(new ServletCookieValueMethodArgumentResolver(this.getBeanFactory()));         resolvers.add(new ExpressionValueMethodArgumentResolver(this.getBeanFactory()));         resolvers.add(new SessionAttributeMethodArgumentResolver());         resolvers.add(new RequestAttributeMethodArgumentResolver());         resolvers.add(new ServletRequestMethodArgumentResolver());         resolvers.add(new ServletResponseMethodArgumentResolver());         resolvers.add(new HttpEntityMethodProcessor(this.getMessageConverters(), this.requestResponseBodyAdvice));         resolvers.add(new RedirectAttributesMethodArgumentResolver());         resolvers.add(new ModelMethodProcessor());         resolvers.add(new MapMethodProcessor());         resolvers.add(new ErrorsMethodArgumentResolver());         resolvers.add(new SessionStatusMethodArgumentResolver());         resolvers.add(new UriComponentsBuilderMethodArgumentResolver());         if (KotlinDetector.isKotlinPresent()) {             resolvers.add(new ContinuationHandlerMethodArgumentResolver());         }
          if (this.getCustomArgumentResolvers() != null) {             resolvers.addAll(this.getCustomArgumentResolvers());         }
          resolvers.add(new PrincipalMethodArgumentResolver());         resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), true));         resolvers.add(new ServletModelAttributeMethodProcessor(true));         return resolvers;     }
      private List<HandlerMethodArgumentResolver> getDefaultInitBinderArgumentResolvers() {         List<HandlerMethodArgumentResolver> resolvers = new ArrayList(20);         resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), false));         resolvers.add(new RequestParamMapMethodArgumentResolver());         resolvers.add(new PathVariableMethodArgumentResolver());         resolvers.add(new PathVariableMapMethodArgumentResolver());         resolvers.add(new MatrixVariableMethodArgumentResolver());         resolvers.add(new MatrixVariableMapMethodArgumentResolver());         resolvers.add(new ExpressionValueMethodArgumentResolver(this.getBeanFactory()));         resolvers.add(new SessionAttributeMethodArgumentResolver());         resolvers.add(new RequestAttributeMethodArgumentResolver());         resolvers.add(new ServletRequestMethodArgumentResolver());         resolvers.add(new ServletResponseMethodArgumentResolver());         if (this.getCustomArgumentResolvers() != null) {             resolvers.addAll(this.getCustomArgumentResolvers());         }
          resolvers.add(new PrincipalMethodArgumentResolver());         resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), true));         return resolvers;     }
      private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {         List<HandlerMethodReturnValueHandler> handlers = new ArrayList(20);         handlers.add(new ModelAndViewMethodReturnValueHandler());         handlers.add(new ModelMethodProcessor());         handlers.add(new ViewMethodReturnValueHandler());         handlers.add(new ResponseBodyEmitterReturnValueHandler(this.getMessageConverters(), this.reactiveAdapterRegistry, this.taskExecutor, this.contentNegotiationManager));         handlers.add(new StreamingResponseBodyReturnValueHandler());         handlers.add(new HttpEntityMethodProcessor(this.getMessageConverters(), this.contentNegotiationManager, this.requestResponseBodyAdvice));         handlers.add(new HttpHeadersReturnValueHandler());         handlers.add(new CallableMethodReturnValueHandler());         handlers.add(new DeferredResultMethodReturnValueHandler());         handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));         handlers.add(new ServletModelAttributeMethodProcessor(false));         handlers.add(new RequestResponseBodyMethodProcessor(this.getMessageConverters(), this.contentNegotiationManager, this.requestResponseBodyAdvice));         handlers.add(new ViewNameMethodReturnValueHandler());         handlers.add(new MapMethodProcessor());         if (this.getCustomReturnValueHandlers() != null) {             handlers.addAll(this.getCustomReturnValueHandlers());         }
          if (!CollectionUtils.isEmpty(this.getModelAndViewResolvers())) {             handlers.add(new ModelAndViewResolverMethodReturnValueHandler(this.getModelAndViewResolvers()));         } else {             handlers.add(new ServletModelAttributeMethodProcessor(true));         }
          return handlers;     }
      protected boolean supportsInternal(HandlerMethod handlerMethod) {         return true;     }
      protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {         this.checkRequest(request);         ModelAndView mav;         if (this.synchronizeOnSession) {             HttpSession session = request.getSession(false);             if (session != null) {                 Object mutex = WebUtils.getSessionMutex(session);                 synchronized(mutex) {                     mav = this.invokeHandlerMethod(request, response, handlerMethod);                 }             } else {                 mav = this.invokeHandlerMethod(request, response, handlerMethod);             }         } else {             mav = this.invokeHandlerMethod(request, response, handlerMethod);         }
          if (!response.containsHeader("Cache-Control")) {             if (this.getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) {                 this.applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers);             } else {                 this.prepareResponse(response);             }         }
          return mav;     }
      protected long getLastModifiedInternal(HttpServletRequest request, HandlerMethod handlerMethod) {         return -1L;     }
      private SessionAttributesHandler getSessionAttributesHandler(HandlerMethod handlerMethod) {         return (SessionAttributesHandler)this.sessionAttributesHandlerCache.computeIfAbsent(handlerMethod.getBeanType(), (type) -> {             return new SessionAttributesHandler(type, this.sessionAttributeStore);         });     }
      @Nullable     protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {         ServletWebRequest webRequest = new ServletWebRequest(request, response);
          Object result;         try {             WebDataBinderFactory binderFactory = this.getDataBinderFactory(handlerMethod);             ModelFactory modelFactory = this.getModelFactory(handlerMethod, binderFactory);             ServletInvocableHandlerMethod invocableMethod = this.createInvocableHandlerMethod(handlerMethod);             if (this.argumentResolvers != null) {                 invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);             }
              if (this.returnValueHandlers != null) {                 invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);             }
              invocableMethod.setDataBinderFactory(binderFactory);             invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);             ModelAndViewContainer mavContainer = new ModelAndViewContainer();             mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));             modelFactory.initModel(webRequest, mavContainer, invocableMethod);             mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);             AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);             asyncWebRequest.setTimeout(this.asyncRequestTimeout);             WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);             asyncManager.setTaskExecutor(this.taskExecutor);             asyncManager.setAsyncWebRequest(asyncWebRequest);             asyncManager.registerCallableInterceptors(this.callableInterceptors);             asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);             if (asyncManager.hasConcurrentResult()) {                 result = asyncManager.getConcurrentResult();                 mavContainer = (ModelAndViewContainer)asyncManager.getConcurrentResultContext()[0];                 asyncManager.clearConcurrentResult();                 LogFormatUtils.traceDebug(this.logger, (traceOn) -> {                     String formatted = LogFormatUtils.formatValue(result, !traceOn);                     return "Resume with async result [" + formatted + "]";                 });                 invocableMethod = invocableMethod.wrapConcurrentResult(result);             }
              invocableMethod.invokeAndHandle(webRequest, mavContainer, new Object[0]);             if (!asyncManager.isConcurrentHandlingStarted()) {                 ModelAndView var15 = this.getModelAndView(mavContainer, modelFactory, webRequest);                 return var15;             }
              result = null;         } finally {             webRequest.requestCompleted();         }
          return (ModelAndView)result;     }
      protected ServletInvocableHandlerMethod createInvocableHandlerMethod(HandlerMethod handlerMethod) {         return new ServletInvocableHandlerMethod(handlerMethod);     }
      private ModelFactory getModelFactory(HandlerMethod handlerMethod, WebDataBinderFactory binderFactory) {         SessionAttributesHandler sessionAttrHandler = this.getSessionAttributesHandler(handlerMethod);         Class<?> handlerType = handlerMethod.getBeanType();         Set<Method> methods = (Set)this.modelAttributeCache.get(handlerType);         if (methods == null) {             methods = MethodIntrospector.selectMethods(handlerType, MODEL_ATTRIBUTE_METHODS);             this.modelAttributeCache.put(handlerType, methods);         }
          List<InvocableHandlerMethod> attrMethods = new ArrayList();         this.modelAttributeAdviceCache.forEach((controllerAdviceBean, methodSet) -> {             if (controllerAdviceBean.isApplicableToBeanType(handlerType)) {                 Object bean = controllerAdviceBean.resolveBean();                 Iterator var7 = methodSet.iterator();
                  while(var7.hasNext()) {                     Method method = (Method)var7.next();                     attrMethods.add(this.createModelAttributeMethod(binderFactory, bean, method));                 }             }
          });         Iterator var7 = methods.iterator();
          while(var7.hasNext()) {             Method method = (Method)var7.next();             Object bean = handlerMethod.getBean();             attrMethods.add(this.createModelAttributeMethod(binderFactory, bean, method));         }
          return new ModelFactory(attrMethods, binderFactory, sessionAttrHandler);     }
      private InvocableHandlerMethod createModelAttributeMethod(WebDataBinderFactory factory, Object bean, Method method) {         InvocableHandlerMethod attrMethod = new InvocableHandlerMethod(bean, method);         if (this.argumentResolvers != null) {             attrMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);         }
          attrMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);         attrMethod.setDataBinderFactory(factory);         return attrMethod;     }
      private WebDataBinderFactory getDataBinderFactory(HandlerMethod handlerMethod) throws Exception {         Class<?> handlerType = handlerMethod.getBeanType();         Set<Method> methods = (Set)this.initBinderCache.get(handlerType);         if (methods == null) {             methods = MethodIntrospector.selectMethods(handlerType, INIT_BINDER_METHODS);             this.initBinderCache.put(handlerType, methods);         }
          List<InvocableHandlerMethod> initBinderMethods = new ArrayList();         this.initBinderAdviceCache.forEach((controllerAdviceBean, methodSet) -> {             if (controllerAdviceBean.isApplicableToBeanType(handlerType)) {                 Object bean = controllerAdviceBean.resolveBean();                 Iterator var6 = methodSet.iterator();
                  while(var6.hasNext()) {                     Method method = (Method)var6.next();                     initBinderMethods.add(this.createInitBinderMethod(bean, method));                 }             }
          });         Iterator var5 = methods.iterator();
          while(var5.hasNext()) {             Method method = (Method)var5.next();             Object bean = handlerMethod.getBean();             initBinderMethods.add(this.createInitBinderMethod(bean, method));         }
          return this.createDataBinderFactory(initBinderMethods);     }
      private InvocableHandlerMethod createInitBinderMethod(Object bean, Method method) {         InvocableHandlerMethod binderMethod = new InvocableHandlerMethod(bean, method);         if (this.initBinderArgumentResolvers != null) {             binderMethod.setHandlerMethodArgumentResolvers(this.initBinderArgumentResolvers);         }
          binderMethod.setDataBinderFactory(new DefaultDataBinderFactory(this.webBindingInitializer));         binderMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);         return binderMethod;     }
      protected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> binderMethods) throws Exception {         return new ServletRequestDataBinderFactory(binderMethods, this.getWebBindingInitializer());     }
      @Nullable     private ModelAndView getModelAndView(ModelAndViewContainer mavContainer, ModelFactory modelFactory, NativeWebRequest webRequest) throws Exception {         modelFactory.updateModel(webRequest, mavContainer);         if (mavContainer.isRequestHandled()) {             return null;         } else {             ModelMap model = mavContainer.getModel();             ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model, mavContainer.getStatus());             if (!mavContainer.isViewReference()) {                 mav.setView((View)mavContainer.getView());             }
              if (model instanceof RedirectAttributes) {                 Map<String, ?> flashAttributes = ((RedirectAttributes)model).getFlashAttributes();                 HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest(HttpServletRequest.class);                 if (request != null) {                     RequestContextUtils.getOutputFlashMap(request).putAll(flashAttributes);                 }             }
              return mav;         }     } }
  |