###org.springframework.web.servlet.DispatcherServlet-doDispatch
if (!mappedHandler
.applyPreHandle(processedRequest
, response
)) {
return;
}
mv
= ha
.handle(processedRequest
, response
, mappedHandler
.getHandler());
if (asyncManager
.isConcurrentHandlingStarted()) {
return;
}
走了org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter#handle
public final ModelAndView
handle(HttpServletRequest request
, HttpServletResponse response
, Object handler
)
throws Exception
{
return handleInternal(request
, response
, (HandlerMethod
) handler
);
}
handleInternal方法
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod
protected ModelAndView
invokeHandlerMethod(HttpServletRequest request
,
HttpServletResponse response
, HandlerMethod handlerMethod
) throws Exception
{
ServletWebRequest webRequest
= new ServletWebRequest(request
, response
);
try {
WebDataBinderFactory binderFactory
= getDataBinderFactory(handlerMethod
);
ModelFactory modelFactory
= getModelFactory(handlerMethod
, binderFactory
);
ServletInvocableHandlerMethod invocableMethod
= 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()) {
Object result
= asyncManager
.getConcurrentResult();
mavContainer
= (ModelAndViewContainer
) asyncManager
.getConcurrentResultContext()[0];
asyncManager
.clearConcurrentResult();
LogFormatUtils
.traceDebug(logger
, traceOn
-> {
String formatted
= LogFormatUtils
.formatValue(result
, !traceOn
);
return "Resume with async result [" + formatted
+ "]";
});
invocableMethod
= invocableMethod
.wrapConcurrentResult(result
);
}
invocableMethod
.invokeAndHandle(webRequest
, mavContainer
);
if (asyncManager
.isConcurrentHandlingStarted()) {
return null
;
}
return getModelAndView(mavContainer
, modelFactory
, webRequest
);
}
finally {
webRequest
.requestCompleted();
}
}
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle
public void invokeAndHandle(ServletWebRequest webRequest
, ModelAndViewContainer mavContainer
,
Object
... providedArgs
) throws Exception
{
Object returnValue
= invokeForRequest(webRequest
, mavContainer
, providedArgs
);
setResponseStatus(webRequest
);
if (returnValue
== null
) {
if (isRequestNotModified(webRequest
) || getResponseStatus() != null
|| mavContainer
.isRequestHandled()) {
disableContentCachingIfNecessary(webRequest
);
mavContainer
.setRequestHandled(true);
return;
}
}
else if (StringUtils
.hasText(getResponseStatusReason())) {
mavContainer
.setRequestHandled(true);
return;
}
mavContainer
.setRequestHandled(false);
Assert
.state(this.returnValueHandlers
!= null
, "No return value handlers");
try {
this.returnValueHandlers
.handleReturnValue(
returnValue
, getReturnValueType(returnValue
), mavContainer
, webRequest
);
}
catch (Exception ex
) {
if (logger
.isTraceEnabled()) {
logger
.trace(formatErrorForReturnValue(returnValue
), ex
);
}
throw ex
;
}
}
org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest
public Object
invokeForRequest(NativeWebRequest request
, @Nullable ModelAndViewContainer mavContainer
,
Object
... providedArgs
) throws Exception
{
Object
[] args
= getMethodArgumentValues(request
, mavContainer
, providedArgs
);
if (logger
.isTraceEnabled()) {
logger
.trace("Arguments: " + Arrays
.toString(args
));
}
return doInvoke(args
);
}
org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues
protected Object
[] getMethodArgumentValues(NativeWebRequest request
, @Nullable ModelAndViewContainer mavContainer
,
Object
... providedArgs
) throws Exception
{
MethodParameter
[] parameters
= getMethodParameters();
if (ObjectUtils
.isEmpty(parameters
)) {
return EMPTY_ARGS
;
}
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
) {
continue;
}
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 ex
) {
if (logger
.isDebugEnabled()) {
String exMsg
= ex
.getMessage();
if (exMsg
!= null
&& !exMsg
.contains(parameter
.getExecutable().toGenericString())) {
logger
.debug(formatArgumentError(parameter
, exMsg
));
}
}
throw ex
;
}
}
return args
;
}
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite#resolveArgument
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.");
}
return resolver
.resolveArgument(parameter
, mavContainer
, webRequest
, binderFactory
);
}
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver#resolveArgument
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.");
}
return resolver
.resolveArgument(parameter
, mavContainer
, webRequest
, binderFactory
);
}
org.springframework.web.method.annotation.RequestParamMethodArgumentResolver#resolveName
protected Object
resolveName(String name
, MethodParameter parameter
, NativeWebRequest request
) throws Exception
{
HttpServletRequest servletRequest
= request
.getNativeRequest(HttpServletRequest
.class);
if (servletRequest
!= null
) {
Object mpArg
= MultipartResolutionDelegate
.resolveMultipartArgument(name
, parameter
, servletRequest
);
if (mpArg
!= MultipartResolutionDelegate
.UNRESOLVABLE
) {
return mpArg
;
}
}
Object arg
= null
;
MultipartRequest multipartRequest
= request
.getNativeRequest(MultipartRequest
.class);
if (multipartRequest
!= null
) {
List
<MultipartFile> files
= multipartRequest
.getFiles(name
);
if (!files
.isEmpty()) {
arg
= (files
.size() == 1 ? files
.get(0) : files
);
}
}
if (arg
== null
) {
String
[] paramValues
= request
.getParameterValues(name
);
if (paramValues
!= null
) {
arg
= (paramValues
.length
== 1 ? paramValues
[0] : paramValues
);
}
}
return arg
;
}
org.springframework.web.method.support.InvocableHandlerMethod#doInvoke方法
@Nullable
protected Object
doInvoke(Object
... args
) throws Exception
{
ReflectionUtils
.makeAccessible(getBridgedMethod());
try {
return getBridgedMethod().invoke(getBean(), args
);
}