분석 중…
DispatcherServlet#doDispatch DispatcherServlet#checkMultipart StandardServletMultipartResolver#resolveMultipart
StandardMultipartHttpServletRequest::new
StandardMultipartHttpServletRequest#parseRequest
HttpServletRequestWrapper#getParts
RequestFacade#getParts() 세번 (무시가능)
Request#getParts
Request#parseParts (여기서 lazyResolve 를 false 를 설정하면 이미 parse 하였기 떄문에 return 을 하게 된다.)
FileUploadBase#parseRequest
DiskFileItemFactory#createItem (DiskFileItem 을 리턴하는 팩토리 메서드)
DiskFileItem::new (Byte 정보를 메모리 혹은 파일에 저장할지 결정하는 객체)
FileUploadBase#parseRequest 로 복귀
Request#parseParts 로 복귀
DiskFileItem#getString
DiskFileItem#get
RequestMapppingHandlerAdapter#handleInternal(request, response, handlerMethod) RequestMapppingHandlerAdapter#invokeHandlerMethod (여기서 HandlerMethodArgumentResolvers 들을 등록 (HandlerMethodArgumentResolver 들을 모아둔 HandlerMethodArgumentResolverComposite))
ServletInvocableHandlerMethod#invokeAndHandle
InvocableHandlerMethod#invokeForRequest
InvocableHandlerMethod#getMethodArgumentValues
반복문으로 Method 매개변수마다 HandlerMethodArgumentResolverComposite을 적용하여 결과값을 받아온다.
한마디로 MultiPart 를 처리하는 RequestPartMethodArgumentResolver 도 실행된다.
HandlerMethodArgumentArgumentResolverComposite#resolveArgument
HandlerMethodArgumentArgumentResolverComposite#getArgumentResolver
파라미터들을 순회하며 현재 파라미터를 처리할 수 있는 ArgumentResolver 룰
HandlerMethodArgumentResolverComposite에서 찾고 이를 Resolve한다.
...
RequestPartMethodArgumentResolver#supportsParameter
RequestPartMethodArgumentResolver#resolveArgument
RequestPartServletServerHttpRequest::new
StandardMultipartHttpServletRequest#getMultipartHeaders
StandardMultipartHttpServletRequest#getPart
Request#getPart
Request#getParts
Request#parseParts
반복문을 통해 Parts 들 중, 파라미터 이름명과 같은 Part 를 조회
Part 정보로 HttpHeader 를 구성한다. (content-disposition 과 같은..)
AbstractMessageConverterMethodArgumentResolver#readWithMessageConverters
Spring의 HttpMessageConverter 를 사용해 HTTP 요청 본문을 읽고 변환하는 역할을 한다.
message = EmptyBodyCheckingHttpInputMessage::new
RequestPartServletServerHttpRequest#getHeaders(multipart 헤더가져옴)
RequestPartServletServerHttpRequest#getBody(InputStream 으로가져온다)
RequestPartServletServerHttpRequest#retrieveServletPart
ApplicationPrt 를 가져온다.
Part 가 null 이 아니면 part 에서 InputStream 을 가져온다.
여기서 Part 는 fileItem. 즉, DiskFileItem 이고 InputStream으로 가져옴
갖고있는 HttpMessageConverter들을 순회하며 message를 변환할 수 있는 Converter 찾음
현재 파라미터가 JSON을 요구하면 MappingJackson2HttpMessageConverter 가 찾아지며
read() 메서드로 JSON 을 읽어온다.
AbstractMessageConverterMethodArgumentResolver#validateIfApplicable
여기서 @Valid, @Validated 를 검사하여 파라미터의 유효성을 검증한다.
WebDataBinder#getBindingResult&&isBindExceptionRequired()로 오류가있는지 확인후 예외
AbstractMessageConverterMethodArgumentResolver#adaptArgumentIfNecessary
여기서 파라미터가 Optional 타입인지 확인하고 of 나 empty 를 반환
System.out.println(System.getProperty(“java.io.tmpdir”));