목차
Spring MVC - ArgumentResolver 
Spring MVC - HttpMessageConverter 
Spring Boot Http 응답 - HTTP API, Message Body에 직접 입력  
Spring Boot 응답 - 정적 리소스, 뷰 템플릿 
Spring Boot 요청 메시지 - JSON
Spring Boot 요청 메시지 - Text 
Spring Boot 쿼리 파라미터, HTML Form 
Spring Boot 기본 헤더 조회 
Spring Boot API 예시 
Spring Boot @RequestMapping 
Spring Boot Logging
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;        }    }}