在上一篇文章中讲了大概的执行流程,这里详细讲一下入参转换和响应转换的实现原理
入参转换和响应转换的流程都是在通过Adapter调用HandlerMethod时发生的。
如下是请求头设置,SpringMVC会根据content-type和accept类型选择合适的HttpMessageConverter
来进行消息的转换
参数转化
private Object[] getMethodArgumentValues(NativeWebRequest request, ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
MethodParameter[] parameters = getMethodParameters();
Object[] args = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
MethodParameter parameter = parameters[i];
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
args[i] = resolveProvidedArgument(parameter, providedArgs);
if (args[i] != null) {
continue;
}
//这里使用组合模式遍历所有参数解析器是否支持
if (this.argumentResolvers.supportsParameter(parameter)) {
try {
args[i] = this.argumentResolvers.resolveArgument(
parameter, mavContainer, request, this.dataBinderFactory);
continue;
}
}
}
return args