Method-Arguments

tokkaiiii·2025년 4월 28일

spring-mvc

목록 보기
7/27

요청하면 DispatcherServlet 의 Dodispatch 메소드 호출

HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());

handlerAdapter 구하는 로직 호출
RequestMappingHandlerAdapter 를 가져올 것이다
handle 메소드를 실행하여 handler 호출해야함

 mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

AbstractHandlerMethodAdapter

 @Nullable
 public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   return this.handleInternal(request, response, (HandlerMethod)handler);
 }

RequestMappingHandlerAdapter 에서

 mav = this.invokeHandlerMethod(request, response, handlerMethod);

로직내에서

 ServletInvocableHandlerMethod invocableMethod = this.createInvocableHandlerMethod(handlerMethod); // 이렇게 실행되고
 invocableMethod.invokeAndHandle(webRequest, mavContainer, new Object[0]);

invocableMethod 에 필요한 인자를 넣어주고 마지막에 invokeAndHandle 메소드를 실행하여 작업을 실시한다

 public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
   Object returnValue = this.invokeForRequest(webRequest, mavContainer, providedArgs);
   this.setResponseStatus(webRequest);
   if (returnValue == null) {
     if (this.isRequestNotModified(webRequest) || this.getResponseStatus() != null || mavContainer.isRequestHandled()) {
       this.disableContentCachingIfNecessary(webRequest);
       mavContainer.setRequestHandled(true);
       return;
     }
   } else if (StringUtils.hasText(this.getResponseStatusReason())) {
     mavContainer.setRequestHandled(true);
     return;
   }

   mavContainer.setRequestHandled(false);
   Assert.state(this.returnValueHandlers != null, "No return value handlers");

   try {
     this.returnValueHandlers.handleReturnValue(returnValue, this.getReturnValueType(returnValue), mavContainer, webRequest);
   } catch (Exception var6) {
     if (logger.isTraceEnabled()) {
       logger.trace(this.formatErrorForReturnValue(returnValue), var6);
     }

     throw var6;
   }
 }
 protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
    MethodParameter[] parameters = this.getMethodParameters();
    if (ObjectUtils.isEmpty(parameters)) {
      return EMPTY_ARGS;
    } else {
      Object[] args = new Object[parameters.length];

      for(int i = 0; i < parameters.length; ++i) {
        MethodParameter parameter = parameters[i];
        parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
        args[i] = findProvidedArgument(parameter, providedArgs);
        if (args[i] == null) {
          if (!this.resolvers.supportsParameter(parameter)) {
            throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));
          }

          try {
            args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
          } catch (Exception var10) {
            if (logger.isDebugEnabled()) {
              String exMsg = var10.getMessage();
              if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) {
                logger.debug(formatArgumentError(parameter, exMsg));
              }
            }

            throw var10;
          }
        }
      }

      return args;
    }
  }

여기서 resolvers 가 27개 있다

  if (!this.resolvers.supportsParameter(parameter)) {
 public boolean supportsParameter(MethodParameter parameter) {
   return this.getArgumentResolver(parameter) != null;
 }
 @Nullable
  public HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
    HandlerMethodArgumentResolver result = (HandlerMethodArgumentResolver)this.argumentResolverCache.get(parameter);
    if (result == null) {
      for(HandlerMethodArgumentResolver resolver : this.argumentResolvers) {
        if (resolver.supportsParameter(parameter)) {
          result = resolver;
          this.argumentResolverCache.put(parameter, resolver);
          break;
        }
      }
    }

    return result;
  }
profile
풀스택 자바 개발자입니다

0개의 댓글